/ Hex Artifact Content
Login

Artifact ba211189d07b4ecb3209c5b236512e786b499786:


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 73  p1, p2, p3);.  s
2470: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2480: 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49  P4(p, addr, SQLI
2490: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34  TE_INT_TO_PTR(p4
24a0: 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
24b0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
24c0: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 65 6e  /* Insert the en
24d0: 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d of a co-routin
24e0: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
24f0: 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
2500: 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 72  e(Vdbe *v, int r
2510: 65 67 59 69 65 6c 64 29 7b 0a 20 20 73 71 6c 69  egYield){.  sqli
2520: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2530: 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
2540: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 0a 20 20  , regYield);..  
2550: 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 74 65 6d  /* Clear the tem
2560: 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
2570: 63 61 63 68 65 2c 20 74 68 65 72 65 62 79 20 65  cache, thereby e
2580: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 65 61 63  nsuring that eac
2590: 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e  h.  ** co-routin
25a0: 65 20 68 61 73 20 69 74 73 20 6f 77 6e 20 69 6e  e has its own in
25b0: 64 65 70 65 6e 64 65 6e 74 20 73 65 74 20 6f 66  dependent set of
25c0: 20 72 65 67 69 73 74 65 72 73 2c 20 62 65 63 61   registers, beca
25d0: 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 0a  use co-routines.
25e0: 20 20 2a 2a 20 6d 69 67 68 74 20 65 78 70 65 63    ** might expec
25f0: 74 20 74 68 65 69 72 20 72 65 67 69 73 74 65 72  t their register
2600: 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65  s to be preserve
2610: 64 20 61 63 72 6f 73 73 20 61 6e 20 4f 50 5f 59  d across an OP_Y
2620: 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a 20 74  ield, and.  ** t
2630: 68 61 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20  hat could cause 
2640: 70 72 6f 62 6c 65 6d 73 20 69 66 20 74 77 6f 20  problems if two 
2650: 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f 75 74 69  or more co-routi
2660: 6e 65 73 20 61 72 65 20 75 73 69 6e 67 20 74 68  nes are using th
2670: 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74 65 6d 70  e same.  ** temp
2680: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 2e 0a  orary register..
2690: 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61 72 73 65    */.  v->pParse
26a0: 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
26b0: 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 52 61    v->pParse->nRa
26c0: 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
26d0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
26e0: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
26f0: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
2700: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
2710: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
2720: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
2730: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
2740: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
2750: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
2760: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
2770: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
2780: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
2790: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
27a0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
27b0: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
27c0: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
27d0: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
27e0: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
27f0: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
2800: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
2810: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
2820: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
2830: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
2840: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
2850: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
2860: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
2870: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
2880: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
2890: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
28a0: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
28b0: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
28c0: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
28d0: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
28e0: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
28f0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
2900: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
2910: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  resolved..**.** 
2920: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
2930: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
2940: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
2950: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2960: 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61  l(Vdbe *v){.  Pa
2970: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
2980: 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d  se;.  int i = p-
2990: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
29a0: 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56  ert( v->magic==V
29b0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
29c0: 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d  ;.  if( (i & (i-
29d0: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  1))==0 ){.    p-
29e0: 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  >aLabel = sqlite
29f0: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
2a00: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
2a10: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b             (i*2+
2a40: 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61  1)*sizeof(p->aLa
2a50: 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  bel[0]));.  }.  
2a60: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
2a70: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
2a80: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
2a90: 74 75 72 6e 20 41 44 44 52 28 69 29 3b 0a 7d 0a  turn ADDR(i);.}.
2aa0: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
2ab0: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
2ac0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2ad0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2ae0: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
2af0: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
2b00: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
2b10: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2b20: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
2b30: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2b40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
2b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2b60: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2b70: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29  (Vdbe *v, int x)
2b80: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
2b90: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2ba0: 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a 20 20 61  j = ADDR(x);.  a
2bb0: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2bc0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2bd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2be0: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61  p->nLabel );.  a
2bf0: 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20  ssert( j>=0 );. 
2c00: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
2c10: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
2c20: 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = v->nOp;.  }
2c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74  .}../*.** Mark t
2c40: 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74  he VDBE as one t
2c50: 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  hat can only be 
2c60: 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f  run one time..*/
2c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2c80: 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62  eRunOnlyOnce(Vdb
2c90: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f  e *p){.  p->runO
2ca0: 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a  nlyOnce = 1;.}..
2cb0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
2cc0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
2cd0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
2ce0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a  multiple times..
2cf0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2d00: 64 62 65 52 65 75 73 61 62 6c 65 28 56 64 62 65  dbeReusable(Vdbe
2d10: 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e   *p){.  p->runOn
2d20: 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23  lyOnce = 0;.}..#
2d30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2d40: 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73  UG /* sqlite3Ass
2d50: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f  ertMayAbort() lo
2d60: 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  gic */../*.** Th
2d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
2d80: 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72   and function ar
2d90: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
2da0: 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  e through all op
2db0: 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64  codes.** in a Vd
2dc0: 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  be main program 
2dd0: 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20  and each of the 
2de0: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72  sub-programs (tr
2df0: 69 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a  iggers) it may .
2e00: 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74  ** invoke direct
2e10: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
2e20: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75  . It should be u
2e30: 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  sed as follows:.
2e40: 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b  **.**   Op *pOp;
2e50: 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72  .**   VdbeOpIter
2e60: 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20   sIter;.**.**   
2e70: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
2e80: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
2e90: 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d  ;.**   sIter.v =
2ea0: 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   v;             
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ec0: 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56  / v is of type V
2ed0: 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65  dbe* .**   while
2ee0: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
2ef0: 65 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a  ext(&sIter)) ){.
2f00: 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d  **     // Do som
2f10: 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a  ething with pOp.
2f20: 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69  **   }.**   sqli
2f30: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
2f40: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a   sIter.apSub);.*
2f50: 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  * .*/.typedef st
2f60: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
2f70: 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75  VdbeOpIter;.stru
2f80: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a  ct VdbeOpIter {.
2f90: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb0: 56 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20  Vdbe to iterate 
2fc0: 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f  through the opco
2fd0: 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50  des of */.  SubP
2fe0: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20  rogram **apSub; 
2ff0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
3000: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  of subprograms *
3010: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20  /.  int nSub;   
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3030: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
3040: 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a  ies in apSub */.
3050: 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20    int iAddr;    
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3070: 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
3080: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72  instruction to r
3090: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
30a0: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
30b0: 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69        /* 0 = mai
30c0: 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66  n program, 1 = f
30d0: 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d  irst sub-program
30e0: 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74   etc. */.};.stat
30f0: 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78  ic Op *opIterNex
3100: 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29  t(VdbeOpIter *p)
3110: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d  {.  Vdbe *v = p-
3120: 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d  >v;.  Op *pRet =
3130: 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20   0;.  Op *aOp;. 
3140: 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28   int nOp;..  if(
3150: 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75   p->iSub<=p->nSu
3160: 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d  b ){..    if( p-
3170: 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >iSub==0 ){.    
3180: 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a    aOp = v->aOp;.
3190: 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e        nOp = v->n
31a0: 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Op;.    }else{. 
31b0: 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70       aOp = p->ap
31c0: 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e  Sub[p->iSub-1]->
31d0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
31e0: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
31f0: 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b-1]->nOp;.    }
3200: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
3210: 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20  iAddr<nOp );..  
3220: 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d    pRet = &aOp[p-
3230: 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e  >iAddr];.    p->
3240: 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28  iAddr++;.    if(
3250: 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29   p->iAddr==nOp )
3260: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b  {.      p->iSub+
3270: 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64  +;.      p->iAdd
3280: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  r = 0;.    }.  .
3290: 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34      if( pRet->p4
32a0: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
32b0: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  RAM ){.      int
32c0: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75   nByte = (p->nSu
32d0: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
32e0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
32f0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
3300: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b  (j=0; j<p->nSub;
3310: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
3320: 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d  f( p->apSub[j]==
3330: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3340: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
3350: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
3360: 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  p->nSub ){.     
3370: 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71     p->apSub = sq
3380: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
3390: 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61  Free(v->db, p->a
33a0: 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pSub, nByte);.  
33b0: 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70        if( !p->ap
33c0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
33d0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
33e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33f0: 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e      p->apSub[p->
3400: 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e  nSub++] = pRet->
3410: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
3420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3430: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
3440: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
3450: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70  * Check if the p
3460: 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e  rogram stored in
3470: 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74   the VM associat
3480: 65 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d  ed with pParse m
3490: 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41  ay.** throw an A
34a0: 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28  BORT exception (
34b0: 63 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74  causing the stat
34c0: 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65  ement, but not e
34d0: 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
34e0: 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65  n.** to be rolle
34f0: 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f  d back). This co
3500: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
3510: 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  if the main prog
3520: 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75  ram or any.** su
3530: 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61  b-programs conta
3540: 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66  ins any of the f
3550: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
3560: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74    *  OP_Halt wit
3570: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
3580: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
3590: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
35a0: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69  OP_HaltIfNull wi
35b0: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
35c0: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
35d0: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
35e0: 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20   OP_Destroy.**  
35f0: 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a   *  OP_VUpdate.*
3600: 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d  *   *  OP_VRenam
3610: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43  e.**   *  OP_FkC
3620: 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d  ounter with P2==
3630: 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  0 (immediate for
3640: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
3650: 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  int).**   *  OP_
3660: 43 72 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20  CreateTable and 
3670: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
3680: 20 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42   (for CREATE TAB
3690: 4c 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  LE AS SELECT ...
36a0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
36b0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
36c0: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
36d0: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
36e0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
36f0: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
3700: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
3710: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
3720: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
3730: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
3740: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
3750: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
3760: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
3770: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
3780: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
3790: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
37a0: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
37b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
37c0: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
37d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
37e0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
37f0: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
3800: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
3810: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
3820: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
3830: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
3840: 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75  ;.  int hasFkCou
3850: 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nter = 0;.  int 
3860: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
3870: 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69   0;.  int hasIni
3880: 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a  tCoroutine = 0;.
3890: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
38a0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
38b0: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
38c0: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
38d0: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
38e0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
38f0: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
3900: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
3910: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
3920: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
3930: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
3940: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
3950: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
3960: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
3970: 65 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  e .     || ((opc
3980: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
3990: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
39a0: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
39b0: 20 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29   ((pOp->p1&0xff)
39c0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
39d0: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
39e0: 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29  OE_Abort)).    )
39f0: 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74  {.      hasAbort
3a00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
3a10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
3a20: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61   opcode==OP_Crea
3a30: 74 65 54 61 62 6c 65 20 29 20 68 61 73 43 72 65  teTable ) hasCre
3a40: 61 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ateTable = 1;.  
3a50: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3a60: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29  _InitCoroutine )
3a70: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
3a80: 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  e = 1;.#ifndef S
3a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
3aa0: 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f  GN_KEY.    if( o
3ab0: 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e  pcode==OP_FkCoun
3ac0: 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d  ter && pOp->p1==
3ad0: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 && pOp->p2==1 
3ae0: 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f  ){.      hasFkCo
3af0: 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  unter = 1;.    }
3b00: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
3b10: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
3b20: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
3b30: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
3b40: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
3b50: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
3b60: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
3b70: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
3b80: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
3b90: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
3ba0: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
3bb0: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
3bc0: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
3bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
3be0: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
3bf0: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
3c00: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
3c10: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
3c20: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
3c30: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
3c40: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
3c50: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
3c60: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
3c70: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
3c80: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
3c90: 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73  =mayAbort || has
3ca0: 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  FkCounter.      
3cb0: 20 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43          || (hasC
3cc0: 72 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61  reateTable && ha
3cd0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20  sInitCoroutine) 
3ce0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
3cf0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
3d00: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
3d10: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
3d20: 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  on */../*.** Thi
3d30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3d40: 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  led after all op
3d50: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
3d60: 69 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f  inserted.  It lo
3d70: 6f 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61  ops.** through a
3d80: 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61  ll the opcodes a
3d90: 6e 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65  nd fixes up some
3da0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
3db0: 28 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d  (1) For each jum
3dc0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  p instruction wi
3dd0: 74 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  th a negative P2
3de0: 20 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29   value (a label)
3df0: 0a 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20  .**     resolve 
3e00: 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20  the P2 value to 
3e10: 61 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73  an actual addres
3e20: 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d  s..**.** (2) Com
3e30: 70 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  pute the maximum
3e40: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
3e50: 65 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79  ents used by any
3e60: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
3e70: 20 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74       and store t
3e80: 68 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d  hat value in *pM
3e90: 61 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a  axFuncArgs..**.*
3ea0: 2a 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65  * (3) Update the
3eb0: 20 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61   Vdbe.readOnly a
3ec0: 6e 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65  nd Vdbe.bIsReade
3ed0: 72 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72  r flags to accur
3ee0: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64  ately.**     ind
3ef0: 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70  icate what the p
3f00: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
3f10: 74 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e  t actually does.
3f20: 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69  .**.** (4) Initi
3f30: 61 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64  alize the p4.xAd
3f40: 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e  vance pointer on
3f50: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73   opcodes that us
3f60: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20  e it..**.** (5) 
3f70: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
3f80: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
3f90: 20 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e   storing labels.
3fa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3fb0: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75  ine will only fu
3fc0: 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79  nction correctly
3fd0: 20 69 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65   if the mkopcode
3fe0: 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a  h.tcl generator.
3ff0: 2a 2a 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72  ** script number
4000: 73 20 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f  s the opcodes co
4010: 72 72 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65  rrectly.  Change
4020: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
4030: 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f  e must be.** coo
4040: 72 64 69 6e 61 74 65 64 20 77 69 74 68 20 63 68  rdinated with ch
4050: 61 6e 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64  anges to mkopcod
4060: 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69  eh.tcl..*/.stati
4070: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
4080: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
4090: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
40a0: 73 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72  s){.  int nMaxAr
40b0: 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72  gs = *pMaxFuncAr
40c0: 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  gs;.  Op *pOp;. 
40d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
40e0: 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   p->pParse;.  in
40f0: 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72  t *aLabel = pPar
4100: 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d  se->aLabel;.  p-
4110: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
4120: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
4130: 30 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  0;.  pOp = &p->a
4140: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20  Op[p->nOp-1];.  
4150: 77 68 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f  while(1){..    /
4160: 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f  * Only JUMP opco
4170: 64 65 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72  des and the shor
4180: 74 20 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61  t list of specia
4190: 6c 20 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65  l opcodes in the
41a0: 20 73 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62   switch.    ** b
41b0: 65 6c 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20  elow need to be 
41c0: 63 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65  considered.  The
41d0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
41e0: 65 6e 65 72 61 74 6f 72 20 73 63 72 69 70 74 20  enerator script 
41f0: 67 72 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c  groups.    ** al
4200: 6c 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  l these opcodes 
4210: 74 6f 67 65 74 68 65 72 20 6e 65 61 72 20 74 68  together near th
4220: 65 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f  e front of the o
4230: 70 63 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69  pcode list.  Ski
4240: 70 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63  p.    ** any opc
4250: 6f 64 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ode that does no
4260: 74 20 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e  t need processin
4270: 67 20 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20  g by virtual of 
4280: 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
4290: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
42a0: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58  r than SQLITE_MX
42b0: 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73  _JUMP_OPCODE, as
42c0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
42d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20  ptimization..   
42e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
42f0: 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f  >opcode<=SQLITE_
4300: 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29  MX_JUMP_OPCODE )
4310: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a  {.      /* NOTE:
4320: 20 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61   Be sure to upda
4330: 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  te mkopcodeh.tcl
4340: 20 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20   when adding or 
4350: 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a  removing.      *
4360: 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69  * cases from thi
4370: 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20  s switch! */.   
4380: 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e     switch( pOp->
4390: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
43a0: 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61    case OP_Transa
43b0: 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20  ction: {.       
43c0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d     if( pOp->p2!=
43d0: 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  0 ) p->readOnly 
43e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  = 0;.          /
43f0: 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * fall thru */. 
4400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4410: 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d   case OP_AutoCom
4420: 6d 69 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73  mit:.        cas
4430: 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20  e OP_Savepoint: 
4440: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
4450: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
4460: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4470: 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66         }.#ifndef
4480: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
4490: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
44a0: 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e  _Checkpoint:.#en
44b0: 64 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65  dif.        case
44c0: 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20   OP_Vacuum:.    
44d0: 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72      case OP_Jour
44e0: 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20  nalMode: {.     
44f0: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
4500: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
4510: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
4520: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4530: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
4540: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4550: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4560: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
4570: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
4580: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
4590: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
45a0: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
45b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
45c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
45d0: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
45e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
45f0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  t n;.          a
4600: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d  ssert( (pOp - p-
4610: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20  >aOp) >= 3 );.  
4620: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4630: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
4640: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
4650: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b          n = pOp[
4660: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20  -1].p1;.        
4670: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
4680: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
4690: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
46a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
46b0: 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  if.        case 
46c0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
46d0: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f   case OP_NextIfO
46e0: 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 63 61 73  pen:.        cas
46f0: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
4700: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
4710: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
4720: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
4730: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
4740: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
4750: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
4760: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4770: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4780: 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 20 20 63  _Prev:.        c
4790: 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65  ase OP_PrevIfOpe
47a0: 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n: {.          p
47b0: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
47c0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
47d0: 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20  evious;.        
47e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
47f0: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
4800: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4820: 20 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65       if( (sqlite
4830: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
4840: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  pOp->opcode] & O
4850: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
4860: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
4870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
4880: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72  DR(pOp->p2)<pPar
4890: 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  se->nLabel );.  
48a0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
48b0: 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d  aLabel[ADDR(pOp-
48c0: 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  >p2)];.      }. 
48d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
48e0: 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b  ==p->aOp ) break
48f0: 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d  ;.    pOp--;.  }
4900: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4910: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
4920: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
4930: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
4940: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
4950: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
4960: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
4970: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
4980: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
4990: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
49a0: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
49b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
49c0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
49d0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
49e0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
49f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4a00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
4a10: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
4a20: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
4a30: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
4a40: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
4a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
4a60: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
4a70: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
4a80: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
4a90: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
4aa0: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
4ab0: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
4ac0: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
4ad0: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
4ae0: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
4af0: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
4b00: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
4b10: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
4b20: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
4b30: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
4b40: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
4b50: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
4b60: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
4b70: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
4b80: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
4b90: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
4ba0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
4bb0: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
4bc0: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
4bd0: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
4be0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4bf0: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
4c00: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4c10: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
4c20: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
4c30: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
4c40: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
4c50: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4c60: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
4c70: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
4c80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4c90: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4ca0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
4cb0: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
4cc0: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
4cd0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
4ce0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
4cf0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4d00: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
4d10: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
4d20: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
4d30: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
4d40: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
4d50: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
4d60: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
4d70: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
4d80: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4d90: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
4da0: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
4db0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4dc0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4dd0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
4de0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
4df0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
4e00: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
4e10: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
4e20: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
4e30: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4e40: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
4e50: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
4e60: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
4e70: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
4e80: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
4e90: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
4ea0: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
4eb0: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
4ec0: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
4ed0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
4ee0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
4ef0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
4f00: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
4f10: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
4f20: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
4f30: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
4f40: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
4f50: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
4f60: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4f70: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
4f80: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
4f90: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
4fa0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
4fb0: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
4fc0: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
4fd0: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
4fe0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
4ff0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
5000: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61  stack.  Return a
5010: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
5020: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
5030: 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  on inserted..**.
5040: 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61  ** Non-zero P2 a
5050: 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70  rguments to jump
5060: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
5070: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
5080: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74  adjusted.** so t
5090: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72  hat the jump tar
50a0: 67 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20  get is relative 
50b0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  to the first ope
50c0: 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e  ration inserted.
50d0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
50e0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
50f0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20   /* Add opcodes 
5120: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
5130: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
5140: 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20  nt nOp,         
5150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5160: 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73  umber of opcodes
5170: 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62   to add */.  Vdb
5180: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
5190: 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Op,       /* The
51a0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61   opcodes to be a
51b0: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  dded */.  int iL
51c0: 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20  ineno           
51d0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
51e0: 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65  -file line numbe
51f0: 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64  r of first opcod
5200: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
5210: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c  .  VdbeOp *pOut,
5220: 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65   *pFirst;.  asse
5230: 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61  rt( nOp>0 );.  a
5240: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
5250: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
5260: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
5270: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
5280: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
5290: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e  growOpArray(p, n
52a0: 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Op) ){.    retur
52b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73  n 0;.  }.  pFirs
52c0: 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  t = pOut = &p->a
52d0: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f  Op[p->nOp];.  fo
52e0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
52f0: 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b  +, aOp++, pOut++
5300: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  ){.    pOut->opc
5310: 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64  ode = aOp->opcod
5320: 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  e;.    pOut->p1 
5330: 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70  = aOp->p1;.    p
5340: 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70  Out->p2 = aOp->p
5350: 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  2;.    assert( a
5360: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
5370: 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63   if( (sqlite3Opc
5380: 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d  odeProperty[aOp-
5390: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
53a0: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70  _JUMP)!=0 && aOp
53b0: 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20  ->p2>0 ){.      
53c0: 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e  pOut->p2 += p->n
53d0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  Op;.    }.    pO
53e0: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
53f0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
5400: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
5410: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
5420: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
5430: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
5440: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
5450: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
5460: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
5470: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
5480: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
5490: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
54a0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
54b0: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
54c0: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
54d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
54e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
54f0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
5500: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
5510: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
5520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
5530: 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70  ntOp(0, i+p->nOp
5540: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e  , &p->aOp[i+p->n
5550: 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Op]);.    }.#end
5560: 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20  if.  }.  p->nOp 
5570: 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e  += nOp;.  return
5580: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20   pFirst;.}..#if 
5590: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
55a0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
55b0: 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64  TATUS)./*.** Add
55c0: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
55d0: 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65   array of counte
55e0: 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71  rs managed by sq
55f0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
5600: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  tatus()..*/.void
5610: 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
5620: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
5630: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
5650: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
5660: 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s() to */.  int 
5670: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20  addrExplain,    
5680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5690: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
56a0: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20  lain (or 0) */. 
56b0: 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20   int addrLoop,  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c   /* Address of l
56e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a  oop counter */ .
56f0: 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c    int addrVisit,
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
5720: 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75  rows visited cou
5730: 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  nter */.  LogEst
5740: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
5750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
5760: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
5770: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
5780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5790: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
57a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
57b0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
57c0: 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a  g scanned */.){.
57d0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
57e0: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
57f0: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
5800: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
5810: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
5820: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
5830: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
5840: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
5850: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
5860: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
5870: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
5880: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
5890: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
58a0: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
58b0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
58c0: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
58d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
58e0: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
58f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
5900: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
5910: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
5920: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
5930: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
5940: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
5950: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
5960: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
5970: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
5980: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
5990: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
59a0: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
59b0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
59c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
59d0: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
59e0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
59f0: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
5a00: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
5a10: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
5a20: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
5a30: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
5a40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
5a50: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5a60: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
5a70: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5a80: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
5a90: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
5aa0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
5ab0: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
5ac0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
5ad0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
5ae0: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
5af0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5b00: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
5b10: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
5b20: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
5b30: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
5b40: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
5b50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5b60: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
5b70: 70 2c 20 75 38 20 70 35 29 7b 0a 20 20 61 73 73  p, u8 p5){.  ass
5b80: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
5b90: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5ba0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5bb0: 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b  >nOp>0 ) p->aOp[
5bc0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70  p->nOp-1].p5 = p
5bd0: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  5;.}../*.** Chan
5be0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
5bf0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
5c00: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
5c10: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
5c20: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
5c30: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
5c40: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
5c50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5c60: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
5c70: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
5c80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5c90: 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d  geP2(p, addr, p-
5ca0: 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nOp);.}.../*.**
5cb0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75   If the input Fu
5cc0: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
5cd0: 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68  is ephemeral, th
5ce0: 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a  en free it.  If.
5cf0: 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69  ** the FuncDef i
5d00: 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20  s not ephermal, 
5d10: 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  then do nothing.
5d20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5d30: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
5d40: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
5d50: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  b, FuncDef *pDef
5d60: 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d 3e  ){.  if( (pDef->
5d70: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
5d80: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
5d90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5da0: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29  DbFree(db, pDef)
5db0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
5dc0: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
5dd0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20  rray(sqlite3 *, 
5de0: 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  Op *, int);../*.
5df0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76  ** Delete a P4 v
5e00: 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72  alue if necessar
5e10: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  y..*/.static SQL
5e20: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
5e30: 64 20 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69  d freeP4Mem(sqli
5e40: 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29  te3 *db, Mem *p)
5e50: 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c  {.  if( p->szMal
5e60: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
5e70: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
5e80: 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  oc);.  sqlite3Db
5e90: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 73  Free(db, p);.}.s
5ea0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
5eb0: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
5ec0: 34 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33  4FuncCtx(sqlite3
5ed0: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f   *db, sqlite3_co
5ee0: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65  ntext *p){.  fre
5ef0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
5f00: 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29  on(db, p->pFunc)
5f10: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5f20: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74  e(db, p);.}.stat
5f30: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
5f40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5f50: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
5f60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20  ){.  assert( db 
5f70: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74  );.  switch( p4t
5f80: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
5f90: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
5fa0: 20 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74      freeP4FuncCt
5fb0: 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63  x(db, (sqlite3_c
5fc0: 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20  ontext*)p4);.   
5fd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5fe0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
5ff0: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  :.    case P4_IN
6000: 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34  T64:.    case P4
6010: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61  _DYNAMIC:.    ca
6020: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
6030: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6040: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
6050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6060: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  }.    case P4_KE
6070: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6080: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
6090: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
60a0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65  KeyInfoUnref((Ke
60b0: 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20  yInfo*)p4);.    
60c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
60d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
60e0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
60f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
6100: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
6110: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6120: 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20   (Expr*)p4);.   
6130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6140: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6150: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
6160: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
6170: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
6180: 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a  lite3_free(p4);.
6190: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
61a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
61b0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
61c0: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
61d0: 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44  ction(db, (FuncD
61e0: 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  ef*)p4);.      b
61f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6200: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
6210: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
6220: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
6230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6240: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
6250: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
6260: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6270: 20 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c     freeP4Mem(db,
6280: 20 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20   (Mem*)p4);.    
6290: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
62a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
62b0: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
62c0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
62d0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
62e0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
62f0: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
6300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6310: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
6320: 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  e the space allo
6330: 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e  cated for aOp an
6340: 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20  d any p4 values 
6350: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
6360: 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e  e.** opcodes con
6370: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49  tained within. I
6380: 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c  f aOp is not NUL
6390: 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  L it is assumed 
63a0: 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e  to contain .** n
63b0: 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a  Op entries. .*/.
63c0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
63d0: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
63e0: 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70  te3 *db, Op *aOp
63f0: 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66  , int nOp){.  if
6400: 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20  ( aOp ){.    Op 
6410: 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f  *pOp;.    for(pO
6420: 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b  p=aOp; pOp<&aOp[
6430: 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20  nOp]; pOp++){.  
6440: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
6450: 79 70 65 20 29 20 66 72 65 65 50 34 28 64 62 2c  ype ) freeP4(db,
6460: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
6470: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
6480: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
6490: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
64a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
64b0: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
64c0: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
64d0: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
64e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
64f0: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
6500: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
6510: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
6520: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6530: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
6540: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
6550: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
6560: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
6570: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
6580: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
6590: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
65a0: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
65b0: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
65c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
65d0: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
65e0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
65f0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
6600: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
6610: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
6620: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
6630: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
6640: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
6650: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
6660: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
6670: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6680: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
6690: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
66a0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
66b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
66c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
66d0: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
66e0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
66f0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
6700: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
6710: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
6720: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
6730: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
6740: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
6750: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
6760: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6770: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
6780: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
6790: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
67a0: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
67b0: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
67c0: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
67d0: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
67e0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
67f0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
6800: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
6810: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
6820: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
6830: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
6840: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
6850: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
6860: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
6870: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
6880: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6890: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
68a0: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
68b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
68c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
68d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
68e0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
68f0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
6900: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
6910: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
6920: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
6930: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
6940: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
6950: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
6960: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
6970: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
6980: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
6990: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
69a0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
69b0: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
69c0: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
69d0: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
69e0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
69f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
6a00: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
6a10: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
6a20: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
6a30: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
6a40: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
6a50: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
6a60: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
6a70: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
6a80: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
6a90: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
6aa0: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
6ab0: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
6ac0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
6ad0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
6ae0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
6af0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
6b00: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
6b10: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
6b20: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
6b30: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
6b40: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
6b50: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
6b60: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
6b70: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
6b80: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
6b90: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
6ba0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
6bb0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
6bc0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
6bd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
6be0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
6bf0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
6c00: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
6c10: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
6c20: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
6c30: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
6c40: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
6c50: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
6c60: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
6c70: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
6c80: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
6c90: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
6ca0: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
6cb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6cc0: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
6cd0: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
6ce0: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
6cf0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
6d00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6d10: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
6d20: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
6d30: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
6d40: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
6d50: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
6d60: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
6d70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
6d80: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
6d90: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
6da0: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
6db0: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
6dc0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
6dd0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
6de0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
6df0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
6e00: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
6e10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
6e20: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
6e30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6e40: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
6e50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
6e60: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
6e70: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
6e80: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
6e90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
6ea0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
6eb0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
6ec0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
6ed0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6ee0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6ef0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
6f00: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
6f10: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
6f20: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
6f30: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
6f40: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
6f50: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
6f60: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
6f70: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
6f80: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
6f90: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
6fa0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
6fb0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
6fc0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
6fd0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
6fe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
6ff0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
7000: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
7010: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
7020: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
7030: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
7040: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7050: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7060: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7070: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7080: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
7090: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
70a0: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
70b0: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
70c0: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
70d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
70e0: 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20  t the P4 on the 
70f0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
7100: 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  ded opcode to th
7110: 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68  e KeyInfo for th
7120: 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e  e.** index given
7130: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7140: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
7150: 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
7160: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
7170: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
7180: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
7190: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
71a0: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
71b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
71c0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
71d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
71e0: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
71f0: 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20  e, pIdx),.      
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a  P4_KEYINFO);.}..
7220: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7230: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
7240: 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  MENTS./*.** Chan
7250: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
7260: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7270: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
7280: 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e  ction.  Or.** in
7290: 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64  sert a No-op and
72a0: 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74   add the comment
72b0: 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73   to that new ins
72c0: 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a  truction.  This.
72d0: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64  ** makes the cod
72e0: 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64  e easier to read
72f0: 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e   during debuggin
7300: 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73  g.  None of this
7310: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61   happens.** in a
7320: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
7330: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
7340: 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56  d vdbeVComment(V
7350: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
7360: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f  ar *zFormat, va_
7370: 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65  list ap){.  asse
7380: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
7390: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
73a0: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
73b0: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
73c0: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
73d0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
73e0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
73f0: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61   p->nOp ){.    a
7400: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b  ssert( p->aOp );
7410: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7420: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  ee(p->db, p->aOp
7430: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
7440: 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  ent);.    p->aOp
7450: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
7460: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  ent = sqlite3VMP
7470: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
7480: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d  rmat, ap);.  }.}
7490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
74a0: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
74b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
74c0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
74d0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
74e0: 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61   p ){.    va_sta
74f0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
7500: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
7510: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
7520: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
7530: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
7540: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
7550: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
7560: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
7570: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
7580: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
7590: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
75a0: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
75b0: 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  op);.    va_star
75c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
75d0: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
75e0: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
75f0: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
7600: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
7610: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  /* NDEBUG */..#i
7620: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
7630: 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20  _COVERAGE./*.** 
7640: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66  Set the value if
7650: 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69   the iSrcLine fi
7660: 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  eld for the prev
7670: 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73  iously coded ins
7680: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
7690: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
76a0: 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20  LineNumber(Vdbe 
76b0: 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a  *v, int iLine){.
76c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
76d0: 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69  Op(v,-1)->iSrcLi
76e0: 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65  ne = iLine;.}.#e
76f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56  ndif /* SQLITE_V
7700: 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a  DBE_COVERAGE */.
7710: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7720: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
7730: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49  iven address.  I
7740: 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73  f the address is
7750: 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74   -1, then.** ret
7760: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
7770: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f  ently inserted o
7780: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pcode..**.** If 
7790: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
77a0: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
77b0: 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20  curred prior to 
77c0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74  the calling of t
77d0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  his.** routine, 
77e0: 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
77f0: 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70  o a dummy VdbeOp
7800: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
7810: 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a  d.  That opcode.
7820: 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62  ** is readable b
7830: 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c  ut not writable,
7840: 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61   though it is ca
7850: 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65  st to a writable
7860: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
7870: 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79  eturn of a dummy
7880: 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74   opcode allows t
7890: 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69  he call to conti
78a0: 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a  nue functioning.
78b0: 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20  ** after an OOM 
78c0: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
78d0: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
78e0: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
78f0: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
7900: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
7910: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
7920: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
7930: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
7940: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
7950: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
7960: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
7970: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
7980: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
7990: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
79a0: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62  Valgrind..*/.Vdb
79b0: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
79c0: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
79d0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43  nt addr){.  /* C
79e0: 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61  89 specifies tha
79f0: 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22  t the constant "
7a00: 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69  dummy" will be i
7a10: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
7a20: 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68  l.  ** zeros, wh
7a30: 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20  ich is correct. 
7a40: 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20   MSVC generates 
7a50: 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72  a warning, never
7a60: 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74  theless. */.  st
7a70: 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d  atic VdbeOp dumm
7a80: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
7a90: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
7aa0: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
7ab0: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
7ac0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
7ad0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
7ae0: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
7af0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
7b00: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
7b10: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
7b20: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
7b30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7b40: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
7b50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7b60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
7b70: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
7b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
7b90: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
7ba0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
7bb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
7bc0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
7bd0: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NTS)./*.** Retur
7be0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
7bf0: 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ue for one of th
7c00: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
7c10: 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a  the opcode pOp.*
7c20: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
7c30: 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a  character c..*/.
7c40: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
7c50: 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f  lateP(char c, co
7c60: 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  nst Op *pOp){.  
7c70: 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74  if( c=='1' ) ret
7c80: 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  urn pOp->p1;.  i
7c90: 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75  f( c=='2' ) retu
7ca0: 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66  rn pOp->p2;.  if
7cb0: 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72  ( c=='3' ) retur
7cc0: 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  n pOp->p3;.  if(
7cd0: 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e   c=='4' ) return
7ce0: 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65   pOp->p4.i;.  re
7cf0: 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a  turn pOp->p5;.}.
7d00: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
7d10: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
7d20: 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20  "comment" field 
7d30: 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65  of a VDBE opcode
7d40: 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   listing..**.** 
7d50: 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69  The Synopsis: fi
7d60: 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20  eld in comments 
7d70: 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  in the vdbe.c so
7d80: 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63  urce file gets c
7d90: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61  onverted.** to a
7da0: 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74  n extra string t
7db0: 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20  hat is appended 
7dc0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70  to the sqlite3Op
7dd0: 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20  codeName().  In 
7de0: 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f  the.** absence o
7df0: 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73  f other comments
7e00: 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20  , this synopsis 
7e10: 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d  becomes the comm
7e20: 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64  ent on the opcod
7e30: 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73  e..** Some trans
7e40: 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a  lation occurs:.*
7e50: 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20  *.**       "PX" 
7e60: 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a       ->  "r[X]".
7e70: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22  **       "PX@PY"
7e80: 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59     ->  "r[X..X+Y
7e90: 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20  -1]"  or "r[x]" 
7ea0: 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a  if y is 0 or 1.*
7eb0: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31  *       "PX@PY+1
7ec0: 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d  " ->  "r[X..X+Y]
7ed0: 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  "    or "r[x]" i
7ee0: 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20  f y is 0.**     
7ef0: 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20    "PY..PY"  ->  
7f00: 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f  "r[X..Y]"      o
7f10: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78  r "r[x]" if y<=x
7f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
7f30: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20  isplayComment(. 
7f40: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20   const Op *pOp, 
7f50: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
7f60: 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65  e to be commente
7f70: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
7f80: 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65  r *zP4,   /* Pre
7f90: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
7fa0: 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f   value for P4 */
7fb0: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  .  char *zTemp, 
7fc0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
7fd0: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20  esult here */.  
7fe0: 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20  int nTemp       
7ff0: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69     /* Space avai
8000: 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d  lable in zTemp[]
8010: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
8020: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
8030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e  const char *zSyn
8040: 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70  opsis;.  int nOp
8050: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20  Name;.  int ii, 
8060: 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b  jj;.  char zAlt[
8070: 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d  50];.  zOpName =
8080: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
8090: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
80a0: 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  nOpName = sql
80b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
80c0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70  Name);.  if( zOp
80d0: 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20  Name[nOpName+1] 
80e0: 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43  ){.    int seenC
80f0: 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  om = 0;.    char
8100: 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69   c;.    zSynopsi
8110: 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e  s = zOpName += n
8120: 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20  OpName + 1;.    
8130: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
8140: 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d  opsis,"IF ",3)==
8150: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
8160: 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
8170: 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20  STOREP2 ){.     
8180: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8190: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29  ntf(sizeof(zAlt)
81a0: 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d  , zAlt, "r[P2] =
81b0: 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69   (%s)", zSynopsi
81c0: 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s+3);.      }els
81d0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
81e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
81f0: 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20  of(zAlt), zAlt, 
8200: 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c  "if %s goto P2",
8210: 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20   zSynopsis+3);. 
8220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79       }.      zSy
8230: 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20  nopsis = zAlt;. 
8240: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
8250: 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31  jj=0; jj<nTemp-1
8260: 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73   && (c = zSynops
8270: 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b  is[ii])!=0; ii++
8280: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ){.      if( c==
8290: 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'P' ){.        c
82a0: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69   = zSynopsis[++i
82b0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
82c0: 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20  c=='4' ){.      
82d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
82e0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
82f0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a  Temp+jj, "%s", z
8300: 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  P4);.        }el
8310: 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b  se if( c=='X' ){
8320: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8330: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8340: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8350: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
8360: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
8370: 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20  seenCom = 1;.   
8380: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8390: 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74        int v1 = t
83a0: 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70  ranslateP(c, pOp
83b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
83c0: 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73   v2;.          s
83d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
83e0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
83f0: 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20  jj, "%d", v1);. 
8400: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
8410: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
8420: 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30  i+1, "@P", 2)==0
8430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8440: 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20  ii += 3;.       
8450: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
8460: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
8470: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +jj);.          
8480: 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65    v2 = translate
8490: 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c  P(zSynopsis[ii],
84a0: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
84b0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
84c0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b  Synopsis+ii+1,"+
84d0: 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  1",2)==0 ){.    
84e0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
84f0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
8500: 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   v2++;.         
8510: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8520: 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20   if( v2>1 ){.   
8530: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8540: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8550: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8560: 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29  "..%d", v1+v2-1)
8570: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8580: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
8590: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
85a0: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50  opsis+ii+1, "..P
85b0: 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70  3", 4)==0 && pOp
85c0: 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p3==0 ){.     
85d0: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a         ii += 4;.
85e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
85f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a      }.        jj
8600: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8610: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
8620: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8630: 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20      zTemp[jj++] 
8640: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = c;.      }.   
8650: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
8660: 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d  Com && jj<nTemp-
8670: 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  5 && pOp->zComme
8680: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
8690: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
86a0: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
86b0: 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43   "; %s", pOp->zC
86c0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a  omment);.      j
86d0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
86e0: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
86f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a      }.    if( jj
8700: 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a  <nTemp ) zTemp[j
8710: 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  j] = 0;.  }else 
8720: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
8730: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8740: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8750: 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f   zTemp, "%s", pO
8760: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
8770: 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74    jj = sqlite3St
8780: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d   }else{.    zTem
87a0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a  p[0] = 0;.    jj
87b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
87c0: 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn jj;.}.#endif 
87d0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
87e0: 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  */..#if VDBE_DIS
87f0: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
8800: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
8810: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f  _CURSOR_HINTS)./
8820: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74  *.** Translate t
8830: 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75  he P4.pExpr valu
8840: 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73  e for an OP_Curs
8850: 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e  orHint opcode in
8860: 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20  to text.** that 
8870: 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64  can be displayed
8880: 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d   in the P4 colum
8890: 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74  n of EXPLAIN out
88a0: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
88b0: 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45 78 70  oid displayP4Exp
88c0: 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45  r(StrAccum *p, E
88d0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
88e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d  onst char *zOp =
88f0: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
8900: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
8910: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
8920: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8930: 6e 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78  ntf(p, "%Q", pEx
8940: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
8950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8960: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
8970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8980: 72 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20 70  rintf(p, "%d", p
8990: 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
89a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
89b0: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
89c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
89d0: 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b  intf(p, "NULL");
89e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
89f0: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
8a00: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
8a10: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72  te3XPrintf(p, "r
8a20: 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54  [%d]", pExpr->iT
8a30: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
8a40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8a50: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
8a60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8a70: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
8a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
8a90: 69 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22 29  intf(p, "rowid")
8aa0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8ab0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
8ac0: 72 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c 20  rintf(p, "c%d", 
8ad0: 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c  (int)pExpr->iCol
8ae0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
8af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8b00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
8b10: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22        zOp = "LT"
8b20: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8b30: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
8b40: 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20     zOp = "LE";  
8b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8b60: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
8b70: 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  zOp = "GT";     
8b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8b90: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70   TK_GE:      zOp
8ba0: 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62 72   = "GE";      br
8bb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8bc0: 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _NE:      zOp = 
8bd0: 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "NE";      break
8be0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
8bf0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51  :      zOp = "EQ
8c00: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8c10: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20     case TK_IS:  
8c20: 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20      zOp = "IS"; 
8c30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c40: 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20  case TK_ISNOT:  
8c50: 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20   zOp = "ISNOT"; 
8c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8c70: 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f  e TK_AND:     zO
8c80: 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62  p = "AND";     b
8c90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8ca0: 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_OR:      zOp =
8cb0: 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61   "OR";      brea
8cc0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  k;.    case TK_P
8cd0: 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41  LUS:    zOp = "A
8ce0: 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  DD";     break;.
8cf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
8d00: 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22  :    zOp = "MUL"
8d10: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8d20: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
8d30: 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20    zOp = "SUB";  
8d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8d50: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
8d60: 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20  Op = "REM";     
8d70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8d80: 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20  TK_BITAND:  zOp 
8d90: 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65  = "BITAND";  bre
8da0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8db0: 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22  BITOR:   zOp = "
8dc0: 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b  BITOR";   break;
8dd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
8de0: 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56  SH:   zOp = "DIV
8df0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8e00: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
8e10: 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54  :  zOp = "LSHIFT
8e20: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
8e30: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20  ase TK_RSHIFT:  
8e40: 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  zOp = "RSHIFT"; 
8e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8e60: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70   TK_CONCAT:  zOp
8e70: 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72   = "CONCAT";  br
8e80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8e90: 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20  _UMINUS:  zOp = 
8ea0: 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b  "MINUS";   break
8eb0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  ;.    case TK_UP
8ec0: 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c  LUS:   zOp = "PL
8ed0: 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  US";    break;. 
8ee0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
8ef0: 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f  T:  zOp = "BITNO
8f00: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
8f10: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20  case TK_NOT:    
8f20: 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20   zOp = "NOT";   
8f30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8f40: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f  e TK_ISNULL:  zO
8f50: 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62  p = "ISNULL";  b
8f60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8f70: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d  K_NOTNULL: zOp =
8f80: 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61   "NOTNULL"; brea
8f90: 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
8fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8fb0: 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20 22  rintf(p, "%s", "
8fc0: 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72  expr");.      br
8fd0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
8fe0: 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  zOp ){.    sqlit
8ff0: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73  e3XPrintf(p, "%s
9000: 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69  (", zOp);.    di
9010: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
9020: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9030: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
9040: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
9050: 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
9060: 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20  nd(p, ",", 1);. 
9070: 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78       displayP4Ex
9080: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  pr(p, pExpr->pRi
9090: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
90a0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
90b0: 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29  ppend(p, ")", 1)
90c0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
90d0: 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  * VDBE_DISPLAY_P
90e0: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
90f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
9100: 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69  R_HINTS) */...#i
9110: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
9120: 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  4./*.** Compute 
9130: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
9140: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
9150: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
9160: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
9170: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
9180: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
9190: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
91a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
91b0: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
91c0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
91d0: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
91e0: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
91f0: 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61   StrAccum x;.  a
9200: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
9210: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72   );.  sqlite3Str
9220: 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c  AccumInit(&x, 0,
9230: 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30   zTemp, nTemp, 0
9240: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
9250: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
9260: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
9270: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a   {.      int j;.
9280: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
9290: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
92a0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
92b0: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
92c0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
92d0: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
92e0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 6b  e3XPrintf(&x, "k
92f0: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
9300: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66  nField);.      f
9310: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
9320: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
9330: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
9340: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
9350: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
9360: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
9370: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
9380: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
9390: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  : "";.        if
93a0: 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20  ( strcmp(zColl, 
93b0: 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a  "BINARY")==0 ) z
93c0: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
93d0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
93e0: 74 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20  tf(&x, ",%s%s", 
93f0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
9400: 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20  rder[j] ? "-" : 
9410: 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  "", zColl);.    
9420: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9430: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
9440: 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20  &x, ")", 1);.   
9450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9460: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9470: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
9480: 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58  S.    case P4_EX
9490: 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70  PR: {.      disp
94a0: 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f  layP4Expr(&x, pO
94b0: 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20  p->p4.pExpr);.  
94c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
94d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
94e0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
94f0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9500: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
9510: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
9520: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 28  e3XPrintf(&x, "(
9530: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
9540: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
9550: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9560: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
9570: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
9580: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
9590: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
95a0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
95b0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
95c0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
95d0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
95e0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
95f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 63  LITE_DEBUG.    c
9600: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
9610: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
9620: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
9630: 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pCtx->pFunc;.   
9640: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9650: 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20  f(&x, "%s(%d)", 
9660: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
9670: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
9680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9690: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
96a0: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
96b0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
96c0: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
96d0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
96e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
96f0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
9700: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
9710: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 64 22 2c  Printf(&x, "%d",
9720: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
9730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9740: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
9750: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9760: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e  3XPrintf(&x, "%.
9770: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
9780: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
9790: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
97a0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
97b0: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
97c0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
97d0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
97e0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
97f0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
9800: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
9810: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
9820: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
9830: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9840: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64  Printf(&x, "%lld
9850: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20  ", pMem->u.i);. 
9860: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
9870: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9880: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Real ){.       
9890: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
98a0: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  &x, "%.16g", pMe
98b0: 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m->u.r);.      }
98c0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
98d0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
98e0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
98f0: 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d   "NULL";.      }
9900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9910: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
9920: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
9930: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28          zP4 = "(
9940: 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a  blob)";.      }.
9950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9960: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9970: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9980: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
9990: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
99a0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
99b0: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
99c0: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
99d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
99e0: 78 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56  x, "vtab:%p", pV
99f0: 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tab);.      brea
9a00: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
9a10: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
9a20: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RRAY: {.      in
9a30: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  t i;.      int *
9a40: 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b  ai = pOp->p4.ai;
9a50: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61  .      int n = a
9a60: 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66  i[0];   /* The f
9a70: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
9a80: 61 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61  an INTARRAY is a
9a90: 6c 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20  lways the.      
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
9ac0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
9ad0: 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f  nts to follow */
9ae0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
9af0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
9b00: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9b10: 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b  f(&x, ",%d", ai[
9b20: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
9b30: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b     zTemp[0] = '[
9b40: 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
9b50: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
9b60: 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20  x, "]", 1);.    
9b70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9b80: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
9b90: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
9ba0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9bb0: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
9bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9bd0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56  .    case P4_ADV
9be0: 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54  ANCE: {.      zT
9bf0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
9c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9c10: 20 20 20 63 61 73 65 20 50 34 5f 54 41 42 4c 45     case P4_TABLE
9c20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9c30: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73  3XPrintf(&x, "%s
9c40: 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d  ", pOp->p4.pTab-
9c50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
9c60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9c70: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
9c80: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
9c90: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
9ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
9cb0: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
9cc0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
9cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9ce0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
9cf0: 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a  ccumFinish(&x);.
9d00: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
9d10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
9d20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44  ;.}.#endif /* VD
9d30: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f  BE_DISPLAY_P4 */
9d40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
9d50: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
9d60: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
9d70: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
9d80: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
9d90: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
9da0: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
9db0: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
9dc0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
9dd0: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
9de0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
9df0: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
9e00: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
9e10: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
9e20: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
9e30: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
9e40: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
9e50: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
9e60: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
9e70: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
9e80: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
9e90: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
9ea0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
9eb0: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
9ec0: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
9ed0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
9ee0: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
9ef0: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
9f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
9f10: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
9f20: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
9f30: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72  DbMaskSet(p->btr
9f40: 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66  eeMask, i);.  if
9f50: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
9f60: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
9f70: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
9f80: 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  ) ){.    DbMaskS
9f90: 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20  et(p->lockMask, 
9fa0: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  i);.  }.}..#if !
9fb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9fc0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
9fd0: 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  )./*.** If SQLit
9fe0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
9ff0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
a000: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
a010: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
a020: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
a030: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
a040: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
a050: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
a060: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
a070: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
a080: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
a090: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
a0a0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
a0b0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
a0c0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
a0d0: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
a0e0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
a0f0: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
a100: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
a110: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
a120: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
a130: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
a140: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
a150: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
a160: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
a170: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
a180: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
a190: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
a1a0: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
a1b0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
a1c0: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
a1d0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
a1e0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
a1f0: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
a200: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
a210: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
a220: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
a230: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
a240: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
a250: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
a260: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
a270: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
a280: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
a290: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
a2a0: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
a2b0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
a2c0: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
a2d0: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
a2e0: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
a2f0: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
a300: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
a310: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
a320: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
a330: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
a340: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
a350: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
a360: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
a370: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
a380: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
a390: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
a3a0: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
a3b0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
a3c0: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
a3d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a3e0: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
a3f0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
a400: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
a410: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
a420: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
a430: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
a440: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
a450: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
a460: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
a470: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
a480: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
a490: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
a4a0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
a4b0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
a4c0: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
a4d0: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
a4e0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
a4f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a500: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
a510: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
a520: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
a530: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a540: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
a550: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
a560: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
a570: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
a580: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
a590: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
a5a0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
a5b0: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73  dbeEnter()..*/.s
a5c0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
a5d0: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c  NLINE void vdbeL
a5e0: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
a5f0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
a600: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
a610: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64  ;.  int nDb;.  d
a620: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
a630: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
a640: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
a650: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
a660: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
a670: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
a680: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
a690: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
a6a0: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
a6b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
a6c0: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  ve(aDb[i].pBt);.
a6d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
a6e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
a6f0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
a700: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
a710: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
a720: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
a730: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
a740: 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a  vdbeLeave(p);.}.
a750: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
a760: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
a770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
a780: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
a790: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
a7a0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
a7b0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
a7c0: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
a7d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a7e0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
a7f0: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
a800: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
a810: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
a820: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
a830: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
a840: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
a850: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
a860: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
a870: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
a880: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
a890: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
a8a0: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
a8b0: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
a8c0: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
a8d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a8e0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
a8f0: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
a900: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
a910: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
a920: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
a930: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
a940: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
a950: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
a960: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
a970: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
a980: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
a990: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
a9a0: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
a9b0: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
a9c0: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
a9d0: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
a9e0: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
a9f0: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
aa00: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
aa10: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
aa20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
aa30: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
aa40: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
aa50: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
aa60: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
aa70: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
aa80: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
aa90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
aaa0: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72  nitialize an arr
aab0: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
aac0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
aad0: 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  oid initMemArray
aae0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20  (Mem *p, int N, 
aaf0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36  sqlite3 *db, u16
ab00: 20 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65   flags){.  while
ab10: 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20  ( (N--)>0 ){.   
ab20: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
ab30: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67   p->flags = flag
ab40: 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c  s;.    p->szMall
ab50: 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  oc = 0;.#ifdef S
ab60: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
ab70: 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20  p->pScopyFrom = 
ab80: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b  0;.#endif.    p+
ab90: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
aba0: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
abb0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
abc0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
abd0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
abe0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
abf0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
ac00: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
ac10: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
ac20: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
ac30: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
ac40: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
ac50: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
ac60: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
ac70: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
ac80: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
ac90: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
aca0: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
acb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
acc0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
acd0: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
ace0: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
acf0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
ad00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ad10: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
ad20: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
ad30: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
ad40: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
ad50: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
ad60: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
ad70: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
ad80: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
ad90: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
ada0: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
adb0: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
adc0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
add0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
ade0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
adf0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
ae00: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
ae10: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
ae20: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
ae30: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
ae40: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
ae50: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
ae60: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
ae70: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
ae80: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
ae90: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
aea0: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
aeb0: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
aec0: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
aed0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
aee0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
aef0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
af00: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
af10: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
af20: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
af30: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
af40: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
af50: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
af60: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
af70: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
af80: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
af90: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
afa0: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
afb0: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
afc0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
afd0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
afe0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
aff0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
b000: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
b010: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
b020: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
b030: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
b040: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
b050: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b060: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
b070: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
b080: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
b090: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
b0a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
b0b0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
b0c0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
b0d0: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
b0e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b0f0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
b100: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
b110: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
b120: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b130: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
b140: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
b150: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
b160: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b170: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
b180: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
b190: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
b1a0: 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  d );.  }.}../*.*
b1b0: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
b1c0: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
b1d0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
b1e0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
b1f0: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
b200: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
b210: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
b220: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
b230: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
b240: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
b250: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
b260: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
b270: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
b280: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
b290: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
b2a0: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
b2b0: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
b2c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b2d0: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
b2e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b2f0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
b300: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
b310: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
b320: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
b330: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
b340: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
b350: 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d  ta(p->v->db, &p-
b360: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
b370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
b380: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b  ee(p->v->db, p);
b390: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b3a0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
b3b0: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
b3c0: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
b3d0: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
b3e0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
b3f0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
b400: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
b410: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
b420: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
b430: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
b440: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
b450: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
b460: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
b470: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
b480: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
b490: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
b4a0: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
b4b0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
b4c0: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
b4d0: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
b4e0: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
b4f0: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
b500: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
b510: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
b520: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
b530: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
b540: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
b550: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
b560: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
b570: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
b580: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57  RY PLAN..**.** W
b590: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
b5a0: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69  1, first the mai
b5b0: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73  n program is lis
b5c0: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f  ted, then each o
b5d0: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  f.** the trigger
b5e0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
b5f0: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f   listed one by o
b600: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
b610: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
b620: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
b630: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
b640: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
b650: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f   /* Stop when ro
b680: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  w count reaches 
b690: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  this */.  int nS
b6a0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b6c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
b6d0: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
b6e0: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
b6f0: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
b700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b710: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
b720: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
b730: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
b750: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20  emory cell hold 
b760: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
b770: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
b780: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
b790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b7a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
b7b0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
b7c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b7f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
b800: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
b810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b820: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
b830: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
b840: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Mem[1];         
b850: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
b860: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
b870: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
b880: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
b890: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
b8a0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
b8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
b8d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
b8e0: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
b8f0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
b900: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
b910: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
b920: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
b930: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
b940: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
b950: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
b960: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
b970: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
b980: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
b990: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
b9a0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
b9b0: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
b9c0: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
b9d0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
b9e0: 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52  Mem, 8);.  p->pR
b9f0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20  esultSet = 0;.. 
ba00: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
ba10: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b  TE_NOMEM_BKPT ){
ba20: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
ba30: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
ba40: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
ba50: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
ba60: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
ba70: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
ba80: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
ba90: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ed.  */.    sqli
baa0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
bab0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bac0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
bad0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
bae0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
baf0: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
bb00: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
bb10: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
bb20: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
bb30: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
bb40: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
bb50: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
bb60: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
bb70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
bb80: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
bb90: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
bba0: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
bbb0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
bbc0: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
bbd0: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
bbe0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
bbf0: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
bc00: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
bc10: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
bc20: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
bc30: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
bc40: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
bc50: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
bc60: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
bc70: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
bc80: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
bc90: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
bca0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
bcb0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
bcc0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
bcd0: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
bce0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
bcf0: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
bd00: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
bd10: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
bd20: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
bd30: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
bd40: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
bd50: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
bd60: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
bd70: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
bd80: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
bd90: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
bda0: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
bdb0: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
bdc0: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
bdd0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
bde0: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
bdf0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
be00: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
be10: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
be20: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
be30: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
be40: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
be50: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
be60: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
be70: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
be80: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
be90: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
bea0: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
beb0: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
bec0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
bed0: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
bee0: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
bef0: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
bf00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
bf10: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
bf20: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
bf30: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
bf40: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
bf50: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
bf60: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
bf70: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
bf80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bf90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
bfa0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
bfb0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
bfc0: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
bfd0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
bfe0: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
bff0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
c000: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
c010: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
c020: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
c030: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  se{.    char *zP
c040: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  4;.    Op *pOp;.
c050: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
c060: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
c070: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
c080: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
c090: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
c0a0: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
c0b0: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
c0c0: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
c0d0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
c0e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c0f0: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
c100: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
c110: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
c120: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
c130: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
c140: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
c150: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
c160: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c170: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
c180: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
c190: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
c1a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
c1b0: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
c1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c1d0: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
c1e0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
c1f0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
c200: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
c210: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c220: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
c230: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
c260: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
c270: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
c280: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c290: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
c2a0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
c2b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
c2c0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
c2d0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
c2e0: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
c2f0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
c300: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
c310: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
c320: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c330: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
c340: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
c350: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
c360: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
c370: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
c380: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
c390: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
c3a0: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
c3b0: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
c3c0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
c3d0: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
c3e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
c3f0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
c400: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
c410: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
c420: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
c430: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
c440: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
c450: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
c460: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
c470: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
c480: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
c490: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
c4a0: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
c4b0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
c4c0: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
c4d0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
c4e0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c4f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
c500: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
c510: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
c520: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
c530: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
c540: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
c550: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
c560: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
c570: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
c580: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
c590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
c5a0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
c5b0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
c5c0: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
c5d0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
c5e0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
c5f0: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
c600: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
c610: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
c620: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
c630: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
c640: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c650: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
c660: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
c670: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
c680: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
c6b0: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
c6c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
c6d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
c6e0: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
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 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
c710: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
c720: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
c730: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
c740: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
c770: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
c780: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
c790: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
c7a0: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
c7b0: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
c7c0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
c7d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c7e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c7f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c800: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c810: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
c820: 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70  ;.    zP4 = disp
c830: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
c840: 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  >z, pMem->szMall
c850: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34  oc);.    if( zP4
c860: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
c870: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a     pMem->n = 0;.
c880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c890: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
c8a0: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
c8b0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
c8c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
c8d0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
c8e0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
c8f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c900: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
c910: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
c920: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
c930: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
c940: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
c950: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
c960: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
c970: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
c980: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
c990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
c9a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c9b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c9c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
c9d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
c9e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
c9f0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
ca00: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
ca10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
ca20: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
ca30: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
ca40: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
ca50: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
ca60: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
ca70: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
ca80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ca90: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
caa0: 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73  ENTS.      if( s
cab0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
cac0: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
cad0: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
cae0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
caf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
cb00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cb10: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
cb20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
cb30: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
cb40: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
cb50: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
cb60: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
cb70: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
cb80: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
cb90: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
cba0: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
cbb0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
cbc0: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cbe0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
cbf0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
cc00: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
cc10: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
cc20: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
cc30: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
cc40: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
cc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
cc60: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
cc70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cc80: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
cc90: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
cca0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ccb0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
ccc0: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
ccd0: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
cce0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
ccf0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
cd00: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
cd10: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
cd20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
cd30: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
cd40: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
cd50: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
cd60: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
cd70: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
cd80: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
cd90: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
cda0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
cdb0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
cdc0: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
cdd0: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
cde0: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
cdf0: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
ce00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
ce10: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
ce20: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
ce30: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
ce40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
ce50: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
ce60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
ce70: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
ce80: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
ce90: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
cea0: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
ceb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
cec0: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
ced0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
cee0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
cef0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
cf00: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
cf10: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
cf20: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
cf30: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
cf40: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
cf50: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
cf60: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
cf70: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
cf80: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
cf90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
cfa0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
cfb0: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
cfc0: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
cfd0: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
cfe0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
cff0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
d000: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d010: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
d020: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
d030: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
d040: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
d050: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
d060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
d070: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
d080: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
d090: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
d0a0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
d0b0: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
d0c0: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
d0d0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
d0e0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
d0f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
d100: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20  TRACE */../* An 
d110: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
d120: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
d130: 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  s bulk memory av
d140: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a  ailable for use.
d150: 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65  ** by subcompone
d160: 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65  nts of a prepare
d170: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70  d statement.  Sp
d180: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
d190: 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75   out.** of a Reu
d1a0: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
d1b0: 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70  t by the allocSp
d1c0: 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65  ace() routine be
d1d0: 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  low..*/.struct R
d1e0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20  eusableSpace {. 
d1f0: 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20   u8 *pSpace;    
d200: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
d210: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
d220: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
d230: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
d240: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
d250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65   */.  int nNeede
d260: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  d;         /* To
d270: 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63  tal bytes that c
d280: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
d290: 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  cated */.};../* 
d2a0: 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  Try to allocate 
d2b0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38  nByte bytes of 8
d2c0: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75  -byte aligned bu
d2d0: 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42  lk memory for pB
d2e0: 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52  uf.** from the R
d2f0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
d300: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
d310: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
d320: 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72  located.** memor
d330: 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  y on success.  I
d340: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d  f insufficient m
d350: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
d360: 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75  le in the.** Reu
d370: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
d380: 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  t, increase the 
d390: 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e  ReusableSpace.nN
d3a0: 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62  eeded.** value b
d3b0: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65  y the amount nee
d3c0: 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ded and return N
d3d0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ULL..**.** If pB
d3e0: 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  uf is not initia
d3f0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d  lly NULL, that m
d400: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65  eans that the me
d410: 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  mory has already
d420: 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
d430: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
d440: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
d450: 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ne, so just retu
d460: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
d470: 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52  pBuf and leave R
d480: 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63  eusableSpace unc
d490: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  hanged..**.** Th
d4a0: 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  is allocator is 
d4b0: 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75  employed to repu
d4c0: 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f  rpose unused slo
d4d0: 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ts at the end of
d4e0: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61   the.** opcode a
d4f0: 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64  rray of prepared
d500: 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72   state for other
d510: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66   memory needs of
d520: 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a   the prepared.**
d530: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
d540: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
d550: 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74  cSpace(.  struct
d560: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a   ReusableSpace *
d570: 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f  p,  /* Bulk memo
d580: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
d590: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
d5a0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
d5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
d5c0: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72  inter to a prior
d5d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
d5e0: 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
d600: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  tes of memory ne
d610: 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  eded */.){.  ass
d620: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
d630: 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70  ALIGNMENT(p->pSp
d640: 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42  ace) );.  if( pB
d650: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79  uf==0 ){.    nBy
d660: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
d670: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
d680: 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b  e <= p->nFree ){
d690: 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20  .      p->nFree 
d6a0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  -= nByte;.      
d6b0: 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63  pBuf = &p->pSpac
d6c0: 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20  e[p->nFree];.   
d6d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
d6e0: 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74  >nNeeded += nByt
d6f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  e;.    }.  }.  a
d700: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
d710: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66  E_ALIGNMENT(pBuf
d720: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  ) );.  return pB
d730: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
d740: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
d750: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
d760: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
d770: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
d780: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
d790: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
d7a0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
d7b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
d7c0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
d7d0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
d7e0: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
d7f0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
d800: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
d810: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
d820: 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  T || p->magic==V
d830: 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20  DBE_MAGIC_RESET 
d840: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
d850: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
d860: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
d870: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
d880: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
d890: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
d8a0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
d8b0: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
d8c0: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
d8d0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
d8e0: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
d8f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
d900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
d910: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
d920: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
d930: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
d940: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
d950: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
d960: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
d970: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
d980: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43  E_Abort;.  p->nC
d990: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
d9a0: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
d9b0: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
d9c0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
d9d0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
d9e0: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
d9f0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
da00: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
da10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
da20: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
da30: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
da40: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
da50: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
da60: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
da70: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
da80: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
da90: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
daa0: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
dab0: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
dac0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
dad0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
dae0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
daf0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69   allocating regi
db00: 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61  sters and initia
db10: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
db20: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
db30: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
db40: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
db50: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
db60: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
db70: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
db80: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
db90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
dba0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
dbb0: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ed exactly once 
dbc0: 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20  on each virtual 
dbd0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
dbe0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
dbf0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
dc00: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
dc10: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
dc20: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
dc30: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
dc40: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68  is called, furth
dc50: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
dc60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc70: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
dc80: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
dc90: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
dca0: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
dcb0: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
dcc0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
dcd0: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
dce0: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
dcf0: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
dd00: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
dd10: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
dd20: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
dd30: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
dd40: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
dd50: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
dd60: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
dd70: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
dd80: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
dd90: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
dda0: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
ddb0: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
ddc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
ddd0: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
dde0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de00: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
de10: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de30: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
de40: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
de50: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
de60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
de70: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
de80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
deb0: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
dec0: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
def0: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
df00: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
df10: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
df20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
df30: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
df40: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
df50: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
df60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
df70: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
df80: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
df90: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dfc0: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52  er */.  struct R
dfd0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20  eusableSpace x; 
dfe0: 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62         /* Reusab
dff0: 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a  le bulk memory *
e000: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  /..  assert( p!=
e010: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e020: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
e030: 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
e040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
e050: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
e060: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
e070: 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50  t( pParse==p->pP
e080: 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70  arse );.  db = p
e090: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
e0a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e0b0: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
e0c0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
e0d0: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
e0e0: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
e0f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
e100: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
e110: 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a  nMaxArg;.  .  /*
e120: 20 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65   Each cursor use
e130: 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  s a memory cell.
e140: 20 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73    The first curs
e150: 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61  or (cursor 0) ca
e160: 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b  n.  ** use aMem[
e170: 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  0] which is not 
e180: 6f 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62  otherwise used b
e190: 79 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  y the VDBE progr
e1a0: 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20  am.  Allocate.  
e1b0: 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ** space at the 
e1c0: 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f  end of aMem[] fo
e1d0: 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20  r cursors 1 and 
e1e0: 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65  greater..  ** Se
e1f0: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
e200: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
e210: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
e220: 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d  ;.  if( nCursor=
e230: 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e  =0 && nMem>0 ) n
e240: 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65  Mem++;  /* Space
e250: 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65   for aMem[0] eve
e260: 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f  n if not used */
e270: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
e280: 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61  t how much reusa
e290: 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ble memory is av
e2a0: 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65  ailable at the e
e2b0: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  nd of the.  ** o
e2c0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
e2d0: 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  is extra memory 
e2e0: 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61  will be realloca
e2f0: 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c  ted for other el
e300: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ements.  ** of t
e310: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
e320: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20  ement..  */.  n 
e330: 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
e340: 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20  Op)*p->nOp);    
e350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e360: 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d  es of opcode mem
e370: 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e  ory used */.  x.
e380: 70 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29  pSpace = &((u8*)
e390: 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20  p->aOp)[n];     
e3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
e3b0: 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72  sed opcode memor
e3c0: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  y */.  assert( E
e3d0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
e3e0: 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b  ENT(x.pSpace) );
e3f0: 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55  .  x.nFree = ROU
e400: 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e  NDDOWN8(pParse->
e410: 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20  szOpAlloc - n); 
e420: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75   /* Bytes of unu
e430: 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  sed memory */.  
e440: 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e  assert( x.nFree>
e450: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e460: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
e470: 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78  MENT(&x.pSpace[x
e480: 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72  .nFree]) );..  r
e490: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
e4a0: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
e4b0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
e4c0: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
e4d0: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
e4e0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
e4f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
e500: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
e510: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
e520: 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70  10;.  }.  p->exp
e530: 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ired = 0;..  /* 
e540: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73  Memory for regis
e550: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73  ters, parameters
e560: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69  , cursor, etc, i
e570: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f  s allocated in o
e580: 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70  ne or two.  ** p
e590: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
e5a0: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
e5b0: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
e5c0: 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  d memory at the 
e5d0: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
e5e0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
e5f0: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
e600: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
e610: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
e620: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
e630: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
e640: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
e650: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
e660: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
e670: 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
e680: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65  using a fresh me
e690: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
e6a0: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
e6b0: 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
e6c0: 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
e6d0: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
e6e0: 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
e6f0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
e700: 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  r memory at the 
e710: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
e720: 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 63  e array.  This c
e730: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
e740: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
e750: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
e760: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
e770: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
e780: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
e790: 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  x.nNeeded = 0;. 
e7a0: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
e7b0: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
e7c0: 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
e7d0: 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61  (Mem));.    p->a
e7e0: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
e7f0: 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56  (&x, p->aVar, nV
e800: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  ar*sizeof(Mem));
e810: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
e820: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
e830: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
e840: 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20  zeof(Mem*));.   
e850: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
e860: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
e870: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
e880: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
e890: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
e8a0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
e8b0: 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61  NSTATUS.    p->a
e8c0: 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
e8d0: 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63  ce(&x, p->anExec
e8e0: 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
e8f0: 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
e900: 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d    if( x.nNeeded=
e910: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e920: 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46  x.pSpace = p->pF
e930: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
e940: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78  allocRawNN(db, x
e950: 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78  .nNeeded);.    x
e960: 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64  .nFree = x.nNeed
e970: 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64  ed;.  }while( !d
e980: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e990: 29 3b 0a 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d  );..  p->nzVar =
e9a0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a   pParse->nzVar;.
e9b0: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61    p->azVar = pPa
e9c0: 72 73 65 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50  rse->azVar;.  pP
e9d0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30  arse->nzVar =  0
e9e0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  ;.  pParse->azVa
e9f0: 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c  r = 0;.  p->expl
ea00: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
ea10: 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d  plain;.  if( db-
ea20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ea30: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30  .    p->nVar = 0
ea40: 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ;.    p->nCursor
ea50: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65   = 0;.    p->nMe
ea60: 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 0;.  }else{.
ea70: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
ea80: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d   nCursor;.    p-
ea90: 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
eaa0: 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d  Var;.    initMem
eab0: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e  Array(p->aVar, n
eac0: 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  Var, db, MEM_Nul
ead0: 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  l);.    p->nMem 
eae0: 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74  = nMem;.    init
eaf0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
eb00: 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f  , nMem, db, MEM_
eb10: 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20  Undefined);.    
eb20: 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c  memset(p->apCsr,
eb30: 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65   0, nCursor*size
eb40: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29  of(VdbeCursor*))
eb50: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
eb60: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
eb70: 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65  STATUS.    memse
eb80: 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20  t(p->anExec, 0, 
eb90: 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
eba0: 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  4));.#endif.  }.
ebb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
ebc0: 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
ebd0: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
ebe0: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
ebf0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
ec00: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
ec10: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
ec20: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
ec30: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
ec40: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
ec50: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
ec60: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
ec70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
ec80: 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 3d  ssert( pCx->pBt=
ec90: 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54  =0 || pCx->eCurT
eca0: 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
ecb0: 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  EE );.  switch( 
ecc0: 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b  pCx->eCurType ){
ecd0: 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
ece0: 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20  E_SORTER: {.    
ecf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
ed00: 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
ed10: 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pCx);.      brea
ed20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ed30: 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a  e CURTYPE_BTREE:
ed40: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78   {.      if( pCx
ed50: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
ed60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
ed70: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
ed80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78        /* The pCx
ed90: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
eda0: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
edb0: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
edc0: 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20  sts, by.        
edd0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
ede0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  e. */.      }els
edf0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
ee00: 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  t( pCx->uc.pCurs
ee10: 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  or!=0 );.       
ee20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
ee30: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63  seCursor(pCx->uc
ee40: 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .pCursor);.     
ee50: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ee60: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ee70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ee80: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
ee90: 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a  CURTYPE_VTAB: {.
eea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
eeb0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72  ab_cursor *pVCur
eec0: 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72   = pCx->uc.pVCur
eed0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71  ;.      const sq
eee0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
eef0: 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70  odule = pVCur->p
ef00: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
ef10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43       assert( pVC
ef20: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e  ur->pVtab->nRef>
ef30: 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72  0 );.      pVCur
ef40: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b  ->pVtab->nRef--;
ef50: 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  .      pModule->
ef60: 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20  xClose(pVCur);. 
ef70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ef80: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
ef90: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
efa0: 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63  cursors in the c
efb0: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f  urrent frame..*/
efc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
efd0: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
efe0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
eff0: 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
f000: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f010: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
f020: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
f030: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
f040: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
f050: 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
f060: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f070: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
f080: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
f090: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
f0a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
f0b0: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
f0c0: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
f0d0: 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73   the VdbeFrame s
f0e0: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
f0f0: 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73  Vdbe. This.** is
f100: 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
f110: 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67  le, when a trigg
f120: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  er sub-program i
f130: 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74  s halted to rest
f140: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74  ore.** control t
f150: 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  o the main progr
f160: 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  am..*/.int sqlit
f170: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f180: 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  re(VdbeFrame *pF
f190: 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  rame){.  Vdbe *v
f1a0: 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20   = pFrame->v;.  
f1b0: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
f1c0: 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53  ame(v);.#ifdef S
f1d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f1e0: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76  T_SCANSTATUS.  v
f1f0: 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d  ->anExec = pFram
f200: 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69  e->anExec;.#endi
f210: 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  f.  v->aOp = pFr
f220: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
f230: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
f240: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
f250: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
f260: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
f270: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
f280: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
f290: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
f2a0: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
f2b0: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
f2c0: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
f2d0: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
f2e0: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
f2f0: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
f300: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
f310: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
f320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
f330: 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62  eteAuxData(v->db
f340: 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &v->pAuxData, 
f350: 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75  -1, 0);.  v->pAu
f360: 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e  xData = pFrame->
f370: 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61  pAuxData;.  pFra
f380: 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30  me->pAuxData = 0
f390: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
f3a0: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
f3b0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
f3c0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
f3d0: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
f3e0: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
f3f0: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
f400: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
f410: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
f420: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
f430: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
f440: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
f450: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
f460: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
f470: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
f480: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
f490: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
f4a0: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
f4b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f4c0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
f4d0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
f4e0: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
f4f0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
f500: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
f510: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
f520: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
f530: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
f540: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
f550: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f560: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
f570: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
f580: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
f590: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f5a0: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
f5b0: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
f5c0: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
f5d0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
f5e0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
f5f0: 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
f600: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
f610: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
f620: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
f630: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
f640: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
f650: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
f660: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
f670: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
f680: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
f690: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
f6a0: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
f6b0: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
f6c0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
f6d0: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
f6e0: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
f6f0: 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
f700: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  ta, -1, 0);.  as
f710: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
f720: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
f730: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
f740: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
f750: 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  run..*/.static v
f760: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
f770: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
f780: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
f790: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
f7a0: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
f7b0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
f7c0: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
f7d0: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
f7e0: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
f7f0: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
f800: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f810: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
f820: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
f830: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
f840: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
f850: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
f860: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
f870: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
f880: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
f890: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  i<p->nMem; i++) 
f8a0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
f8b0: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
f8c0: 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
f8d0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
f8e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
f8f0: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
f900: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
f910: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
f920: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f930: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
f940: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
f950: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
f960: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
f970: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
f980: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
f990: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
f9a0: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
f9b0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
f9c0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
f9d0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
f9e0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
f9f0: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
fa00: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
fa10: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
fa20: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
fa30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
fa40: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
fa50: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
fa60: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
fa70: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
fa80: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
fa90: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
faa0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
fab0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
fac0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
fad0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
fae0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
faf0: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
fb00: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
fb10: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
fb20: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
fb30: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
fb40: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
fb50: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fb60: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  NN(db, sizeof(Me
fb70: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
fb80: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
fb90: 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d  eturn;.  initMem
fba0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
fbb0: 65 2c 20 6e 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d  e, n, p->db, MEM
fbc0: 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Null);.}../*.**
fbd0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
fbe0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
fbf0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
fc00: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
fc10: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
fc20: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
fc30: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
fc40: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
fc50: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
fc60: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
fc70: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
fc80: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
fc90: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
fca0: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
fcb0: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
fcc0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
fcd0: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
fce0: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
fcf0: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
fd00: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
fd10: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
fd20: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
fd30: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
fd40: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
fd50: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
fd60: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
fd70: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
fd80: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
fd90: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
fdc0: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
fdd0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
fe00: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
fe10: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
fe20: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
fe50: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
fe60: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
fe70: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
fe80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
fe90: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
fea0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
feb0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
fec0: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
fed0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
fee0: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
fef0: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
ff00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
ff10: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
ff20: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
ff30: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
ff40: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
ff50: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
ff60: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ff70: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
ff80: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
ff90: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
ffa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ffb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
ffc0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ffd0: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
ffe0: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
fff0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
10000 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
10010 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
10020 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
10030 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
10040 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
10050 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
10060 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
10070 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
10080 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
10090 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
100a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
100b0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
100c0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
100d0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
100e0 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
100f0 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
10100 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
10110 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
10120 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
10130 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
10140 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
10150 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
10160 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
10170 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
10180 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
10190 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
101a0 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
101b0 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
101c0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
101d0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
101e0 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
101f0 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
10200 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
10210 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
10220 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
10240 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69  * that are candi
10250 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d  dates for a two-
10260 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69  phase commit usi
10270 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20  ng a.           
10280 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65          ** maste
10290 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  r-journal */.  i
102a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
102b0 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
102c0 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
102d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
102e0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
102f0 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
10300 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
10310 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
10320 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
10330 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
10340 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
10350 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
10360 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
10370 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
10380 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
10390 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
103a0 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
103b0 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
103c0 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
103d0 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
103e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
103f0 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
10400 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
10410 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
10420 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
10430 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
10440 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
10450 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
10460 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
10470 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
10480 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
10490 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
104a0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
104b0 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
104c0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
104d0 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
104e0 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
104f0 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
10500 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
10510 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
10520 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
10530 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
10540 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
10550 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
10560 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
10570 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
10580 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
10590 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
105a0 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
105b0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
105c0 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
105d0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
105e0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
105f0 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
10600 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
10610 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10620 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10630 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
10640 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10650 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
10660 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
10670 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
10680 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
10690 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  or not a databas
106a0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d  e might need a m
106b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65  aster journal de
106c0 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20  pends upon.     
106d0 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20   ** its journal 
106e0 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65  mode (among othe
106f0 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73  r things).  This
10700 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e   matrix determin
10710 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  es which.      *
10720 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20  * journal modes 
10730 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  use a master jou
10740 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64  rnal and which d
10750 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73  o not */.      s
10760 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
10770 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20  MJNeeded[] = {. 
10780 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45         /* DELETE
10790 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20     */  1,.      
107a0 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a    /* PERSIST   *
107b0 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
107c0 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  OFF       */ 0,.
107d0 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43          /* TRUNC
107e0 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20  ATE  */ 1,.     
107f0 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20     /* MEMORY    
10800 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 0,.        /*
10810 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a   WAL       */ 0.
10820 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50        };.      P
10830 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
10840 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61  /* Pager associa
10850 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a  ted with pBt */.
10860 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
10870 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  t = 1;.      sql
10880 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10890 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Bt);.      pPage
108a0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
108b0 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
108c0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
108d0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50  .safety_level!=P
108e0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
108f0 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61  _OFF.       && a
10900 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33  MJNeeded[sqlite3
10910 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d  PagerGetJournalM
10920 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20  ode(pPager)].   
10930 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61     ){ .        a
10940 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20  ssert( i!=1 );. 
10950 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b         nTrans++;
10960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
10970 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10980 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
10990 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
109a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
109b0 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
109c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
109d0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
109e0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
109f0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
10a00 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10a10 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
10a20 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
10a30 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
10a40 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
10a50 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
10a60 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
10a70 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
10a80 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
10a90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10ab0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
10ac0 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
10ad0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
10ae0 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
10af0 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
10b00 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
10b10 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
10b20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
10b30 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
10b40 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
10b50 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
10b60 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
10b70 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
10b80 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
10b90 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
10ba0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
10bb0 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
10bc0 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
10bd0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
10be0 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
10bf0 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
10c00 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
10c10 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
10c20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
10c30 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
10c40 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
10c50 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
10c60 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
10c70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
10c80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
10c90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
10ca0 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
10cb0 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
10cc0 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
10cd0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
10ce0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
10cf0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
10d00 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10d10 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10d20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10d30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10d40 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10d50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
10d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10d70 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
10d80 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
10d90 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
10da0 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
10db0 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
10dc0 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
10dd0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10de0 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
10df0 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
10e00 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
10e10 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
10e20 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
10e30 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
10e40 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
10e50 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
10e60 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
10e70 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
10e80 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
10e90 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
10ea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
10eb0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10ec0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10ed0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
10ee0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10ef0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
10f00 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
10f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10f20 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
10f30 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
10f40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10f70 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
10f80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10f90 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
10fa0 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
10fb0 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
10fc0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
10fd0 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
10fe0 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
10ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
11000 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
11010 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
11020 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
11030 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
11040 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
11050 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
11060 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
11070 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
11080 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
11090 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
110a0 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
110b0 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
110c0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
110d0 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
110e0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
110f0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
11100 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11110 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
11120 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
11130 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
11140 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
11150 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
11160 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
11170 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
11180 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11190 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
111a0 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
111b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
111c0 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
111d0 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
111e0 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
111f0 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
11200 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
11210 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
11220 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11230 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  BKPT;.    do {. 
11240 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
11250 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
11260 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
11270 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
11280 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
11290 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
112a0 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
112b0 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
112c0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
112d0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
112e0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
112f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
11300 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
11310 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
11320 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
11330 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
11340 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
11350 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
11360 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
11370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11380 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
11390 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
113a0 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
113b0 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
113c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
113d0 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
113e0 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
113f0 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
11400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
11430 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
11440 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
11450 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
11460 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
11470 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11480 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
11490 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
114a0 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
114b0 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
114c0 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
114d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
114e0 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
114f0 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
11500 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
11510 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
11520 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
11530 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
11550 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
11560 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
11570 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
11580 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
11590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
115a0 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
115b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
115c0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
115d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
115e0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
115f0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
11600 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
11610 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
11620 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11630 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
11640 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
11650 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
11660 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
11670 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
11680 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
11690 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
116a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
116b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
116c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
116d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
116e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
116f0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
11700 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
11710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
11720 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11730 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
11740 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
11750 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
11760 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
11770 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
11780 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
11790 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
117a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
117b0 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
117c0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
117d0 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
117e0 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
117f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11800 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
11810 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
11820 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
11830 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
11840 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
11850 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11860 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11870 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11880 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11890 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
118a0 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
118b0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
118c0 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
118d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
118e0 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
118f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
11900 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
11910 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
11920 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
11930 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
11940 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
11950 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
11960 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
11970 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
11980 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
11990 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
119a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
119b0 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
119c0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
119d0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
119e0 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
119f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11a10 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11a20 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11a30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11a40 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
11a50 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
11a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11a70 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11a80 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
11a90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11aa0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11ab0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
11ac0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11ad0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
11ae0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
11af0 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
11b00 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
11b10 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
11b20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d     */.    if( 0=
11b30 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
11b40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
11b50 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
11b60 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
11b70 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
11b80 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
11b90 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
11ba0 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
11bb0 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
11bc0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11bd0 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11be0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
11bf0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11c00 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
11c10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11c20 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11c30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11c40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
11c50 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
11c60 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
11c70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
11c80 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
11c90 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
11ca0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11cb0 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
11cc0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
11cd0 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
11ce0 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
11cf0 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
11d00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11d10 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
11d20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
11d30 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
11d40 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
11d50 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
11d60 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11d70 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
11d80 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
11d90 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
11da0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11db0 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
11dc0 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
11dd0 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
11de0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
11df0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11e00 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
11e10 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
11e20 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
11e30 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
11e40 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
11e50 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
11e60 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
11e70 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
11e80 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
11e90 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11ea0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11eb0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
11ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
11ed0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
11ee0 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
11ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11f00 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11f10 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11f20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
11f30 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
11f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11f60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11f70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11f80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
11f90 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
11fa0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11fb0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
11fc0 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
11fd0 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
11fe0 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
11ff0 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
12000 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
12010 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
12020 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
12030 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
12040 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
12050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12060 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
12070 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
12080 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12090 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
120a0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
120b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
120c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
120d0 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
120e0 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
120f0 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
12100 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
12110 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12120 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
12130 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
12140 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
12150 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
12160 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
12170 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
12180 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
12190 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
121a0 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
121b0 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
121c0 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
121d0 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
121e0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
121f0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
12200 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
12210 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
12220 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
12230 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
12240 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
12250 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
12260 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
12270 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
12280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
12290 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
122a0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
122b0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
122c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
122d0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
122e0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
122f0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12300 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12310 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
12320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
12330 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
12340 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
12350 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
12360 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
12370 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
12380 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12390 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
123a0 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
123b0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
123c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
123d0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
123e0 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
123f0 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
12400 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
12410 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
12420 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
12430 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
12440 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
12450 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
12460 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
12470 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
12480 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
12490 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
124a0 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
124b0 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
124c0 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
124d0 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
124e0 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
124f0 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
12500 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
12510 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
12520 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
12530 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
12540 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
12550 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
12560 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
12570 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
12580 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
12590 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
125a0 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
125b0 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
125c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
125d0 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
125e0 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
125f0 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
12600 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
12610 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
12620 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
12630 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
12640 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
12650 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
12660 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
12670 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
12680 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
12690 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
126a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
126b0 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
126c0 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
126d0 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
126e0 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
126f0 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
12700 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
12710 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
12720 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
12730 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
12740 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
12750 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
12760 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
12770 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12780 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
12790 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
127a0 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
127b0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
127c0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
127d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
127e0 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
127f0 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
12800 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
12810 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
12820 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
12830 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
12840 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
12850 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
12860 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
12870 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
12880 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
12890 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
128a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
128b0 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
128c0 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
128d0 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
128e0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
128f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12900 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
12910 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
12920 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
12930 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
12940 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
12950 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12960 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
12970 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
12980 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
12990 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
129a0 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
129b0 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75  ve occurred, cau
129c0 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
129d0 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
129e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
129f0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
12a00 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
12a10 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
12a20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
12a30 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
12a40 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
12a50 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
12a60 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
12a70 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
12a80 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
12a90 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12aa0 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
12ab0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
12ac0 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
12ad0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
12ae0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12af0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
12b00 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
12b10 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
12b20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
12b30 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12b40 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
12b50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12b60 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
12b70 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
12b80 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
12b90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
12ba0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12bb0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12bc0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
12bd0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
12be0 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
12bf0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
12c00 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
12c10 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
12c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12c30 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
12c40 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
12c50 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
12c60 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
12c70 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
12c80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
12c90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12ca0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
12cb0 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
12cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
12cd0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
12ce0 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
12cf0 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  nt = 0;..    if(
12d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12d10 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d  {.      if( eOp=
12d20 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12d30 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ACK ){.        r
12d40 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
12d50 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
12d60 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
12d70 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12d80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12da0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12db0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
12dc0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
12dd0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
12de0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
12df0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12e00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
12e10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
12e20 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
12e30 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
12e40 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
12e50 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
12e60 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
12e70 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
12e80 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
12e90 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
12ea0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12eb0 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
12ec0 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
12ed0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12ee0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
12ef0 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
12f00 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
12f10 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
12f20 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
12f30 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
12f40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12f50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12f60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12f70 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
12f80 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
12f90 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
12fa0 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
12fb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12fc0 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
12fd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
12fe0 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
12ff0 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
13000 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
13010 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
13020 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
13030 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
13040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13050 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
13060 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
13070 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
13080 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
13090 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
130a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
130b0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
130c0 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
130d0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
130e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
130f0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
13100 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
13110 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
13120 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
13130 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
13140 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13150 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
13160 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
13170 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
13180 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
13190 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
131a0 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
131b0 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
131c0 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
131d0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
131e0 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
131f0 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
13200 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
13210 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
13220 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13230 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
13240 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
13250 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
13260 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
13270 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
13280 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
13290 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
132a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
132b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
132c0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
132d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
132e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
132f0 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
13300 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
13310 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
13320 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
13330 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
13340 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
13350 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
13360 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
13370 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
13380 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
13390 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
133a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
133b0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
133c0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
133d0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
133e0 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
133f0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
13400 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
13410 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
13420 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
13430 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
13440 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
13450 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
13460 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
13470 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
13480 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
13490 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
134a0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
134b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
134c0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
134d0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
134e0 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
134f0 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
13500 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
13510 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
13520 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
13530 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
13540 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
13570 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
13580 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
13590 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
135a0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
135b0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
135c0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
135d0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
135e0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
135f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
13600 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
13610 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
13620 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
13630 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
13640 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
13650 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
13660 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
13670 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
13680 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
13690 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
136a0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
136b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
136c0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
136d0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
136e0 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
136f0 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
13700 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
13710 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
13720 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
13730 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
13740 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
13750 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
13760 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
13770 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
13780 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
13790 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
137a0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
137b0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
137c0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
137d0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
137e0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
137f0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
13800 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63  EM_BKPT;.  }.  c
13810 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
13820 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
13830 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
13840 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
13850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13860 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
13870 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
13880 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
13890 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
138a0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
138b0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
138c0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
138d0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
138e0 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
138f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
13900 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
13910 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
13920 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
13930 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
13940 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
13950 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
13960 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
13970 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
13980 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
13990 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
139a0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
139b0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
139c0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
139d0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
139e0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
139f0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
13a00 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
13a10 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
13a20 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
13a30 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
13a40 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
13a50 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
13a60 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
13a70 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
13a80 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13aa0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
13ab0 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
13ac0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
13ad0 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
13ae0 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
13af0 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
13b00 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
13b10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
13b20 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
13b30 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
13b40 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
13b50 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
13b60 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
13b70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
13b80 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
13b90 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
13ba0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
13bb0 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
13bc0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
13bd0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
13be0 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
13bf0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
13c00 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
13c10 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
13c20 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
13c30 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
13c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
13c50 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
13c60 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
13c70 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
13c80 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
13c90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
13ca0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
13cb0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
13cc0 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
13cd0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
13ce0 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
13cf0 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
13d00 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
13d10 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
13d20 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
13d30 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
13d40 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
13d50 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
13d60 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
13d70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13d80 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
13d90 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
13da0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
13db0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
13dc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
13dd0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
13de0 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
13df0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
13e00 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
13e10 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
13e20 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
13e30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13e40 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
13e50 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
13e60 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
13e70 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
13e80 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
13e90 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
13ea0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
13eb0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
13ec0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
13ed0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13ee0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13ef0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
13f00 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
13f10 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
13f20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
13f30 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
13f40 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
13f50 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
13f60 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
13f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
13f80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
13f90 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
13fa0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
13fb0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
13fc0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
13fd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13ff0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
14000 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
14010 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
14020 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
14030 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
14040 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
14050 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
14060 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
14070 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
14080 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
14090 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
140a0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
140b0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
140c0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
140d0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
140e0 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
140f0 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
14100 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
14110 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
14120 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
14130 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
14140 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
14150 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
14160 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
14170 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
14180 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14190 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
141a0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
141b0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
141c0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
141d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
141e0 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
141f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
14220 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
14230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14240 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
14250 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
14260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14270 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
14280 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
14290 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
142a0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
142b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
142c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
142d0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
142e0 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
142f0 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
14300 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
14310 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
14320 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
14330 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
14340 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
14350 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
14360 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
14370 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
14380 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14390 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
143a0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
143b0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
143c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
143d0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
143e0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
143f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
14400 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
14410 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14430 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
14440 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14450 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
14460 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
14470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14480 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14490 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
144a0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
144b0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
144c0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
144d0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
144e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
144f0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
14500 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
14510 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
14520 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
14530 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
14540 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
14550 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
14560 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
14570 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
14580 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
14590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
145a0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
145b0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
145c0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
145d0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
145e0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
145f0 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
14600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
14610 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
14620 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
14630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
14640 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
14650 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
14660 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
14670 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
14680 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
14690 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
146a0 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
146b0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
146c0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
146d0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
146e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
146f0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14700 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14710 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
14730 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
14740 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
14750 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
14760 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14770 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14780 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
14790 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
147a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
147b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
147c0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
147d0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
147e0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
147f0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
14800 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14810 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
14820 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
14830 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
14840 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
14850 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
14860 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
14870 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
14880 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
14890 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
148a0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
148b0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
148c0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
148d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
148e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
148f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14900 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14910 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
14920 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
14930 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
14940 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14950 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
14960 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
14970 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
14980 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
14990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
149b0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
149c0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
149d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
149e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
149f0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14a00 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
14a10 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
14a20 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
14a30 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
14a40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14a50 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
14a60 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14a70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
14a80 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
14a90 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
14aa0 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
14ab0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
14ac0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
14ad0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
14ae0 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
14af0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14b00 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
14b10 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
14b20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
14b30 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
14b40 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
14b50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14b60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
14b70 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
14b80 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
14b90 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
14ba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14bb0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
14bc0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
14bd0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14be0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
14bf0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
14c00 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
14c10 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
14c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
14c30 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
14c40 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
14c50 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
14c60 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
14c70 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
14c80 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
14c90 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
14ca0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
14cb0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
14cc0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
14cd0 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
14ce0 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
14cf0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
14d00 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
14d10 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
14d20 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
14d30 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
14d40 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
14d50 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
14d60 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
14d70 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
14d80 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
14d90 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
14da0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14db0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14dc0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
14dd0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
14de0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
14df0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
14e00 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
14e10 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
14e20 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
14e30 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
14e40 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
14e50 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
14e60 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
14e70 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
14e80 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
14e90 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
14ea0 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
14eb0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
14ec0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
14ed0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
14ee0 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
14ef0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
14f00 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
14f10 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
14f20 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
14f30 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
14f40 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
14f50 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
14f60 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
14f70 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
14f80 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
14f90 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
14fa0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
14fb0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
14fc0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
14fd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
14fe0 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
14ff0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
15000 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15010 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
15020 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
15030 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15040 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
15050 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
15060 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
15070 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
15080 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
15090 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
150a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
150b0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
150c0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
150d0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
150e0 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
150f0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
15100 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
15110 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
15120 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
15130 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
15140 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
15150 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
15160 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
15170 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
15180 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15190 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
151a0 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
151b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
151c0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
151d0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
151e0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
151f0 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
15200 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  loc++;.    sqlit
15210 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
15220 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
15230 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
15240 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
15250 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
15260 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15270 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
15280 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
15290 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
152a0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
152b0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
152c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
152d0 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
152e0 63 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  c--;.    db->err
152f0 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
15300 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
15310 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
15320 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15330 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15340 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
15350 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
15360 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
15370 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
15380 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
15390 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
153a0 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
153b0 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
153c0 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
153d0 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
153e0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
153f0 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
15400 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
15410 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
15420 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
15430 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
15440 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
15450 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
15460 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
15470 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
15480 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
15490 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
154a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
154b0 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
154c0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
154d0 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
154e0 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
154f0 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
15500 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15510 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
15520 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
15530 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15540 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
15550 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
15560 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
15570 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
15580 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
15590 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
155a0 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
155b0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
155c0 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
155d0 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
155e0 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
155f0 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
15600 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
15610 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
15620 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
15630 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
15640 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
15650 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
15660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
15670 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
15680 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
15690 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
156a0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
156b0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
156c0 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
156d0 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
156e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
156f0 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
15700 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
15710 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
15720 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
15730 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
15740 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
15750 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
15760 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
15770 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
15780 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
15790 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
157a0 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
157b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
157c0 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
157d0 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
157e0 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
157f0 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
15800 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
15810 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
15820 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
15830 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
15840 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
15850 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
15860 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
15870 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
15880 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
15890 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
158a0 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
158b0 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
158c0 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
158d0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
158e0 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
158f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15900 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
15910 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
15920 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
15930 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
15940 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
15950 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
15960 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
15970 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
15980 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
15990 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
159a0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
159b0 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
159c0 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
159d0 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
159e0 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
159f0 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
15a00 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
15a10 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
15a20 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
15a30 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
15a40 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
15a50 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
15a60 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
15a70 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
15a80 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
15a90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
15aa0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d  orWithMsg(db, p-
15ab0 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20  >rc, p->zErrMsg 
15ac0 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a  ? "%s" : 0, p->z
15ad0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
15ae0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15af0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15b00 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
15b10 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
15b20 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
15b30 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
15b40 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
15b50 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
15b60 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
15b70 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
15b80 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
15b90 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
15ba0 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
15bb0 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
15bc0 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
15bd0 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
15be0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
15bf0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15c00 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
15c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
15c20 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
15c30 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
15c40 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
15c50 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
15c60 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
15c70 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
15c80 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29     if( p->zSql )
15c90 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
15ca0 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  , pc = 0;.      
15cb0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15cc0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  -- ");.        f
15cd0 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e  or(i=0; (c = p->
15ce0 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  zSql[i])!=0; i++
15cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
15d00 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc=='\n' ) fpri
15d10 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15d20 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28  .          putc(
15d30 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  c, out);.       
15d40 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20     pc = c;.     
15d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
15d60 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc!='\n' ) fpri
15d70 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
15d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
15d90 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
15da0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
15db0 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20  har zHdr[100];. 
15dc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
15dd0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
15de0 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75  Hdr), zHdr, "%6u
15df0 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c   %12llu %8llu ",
15e00 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
15e10 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
15e20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
15e30 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
15e40 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
15e50 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
15e60 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
15e70 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
15e80 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
15e90 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  tf(out, "%s", zH
15ea0 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
15eb0 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
15ec0 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
15ed0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
15ee0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
15ef0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15f00 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69  .  p->iCurrentTi
15f10 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67  me = 0;.  p->mag
15f20 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
15f30 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20  RESET;.  return 
15f40 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
15f50 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
15f60 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
15f70 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
15f80 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
15f90 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
15fa0 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
15fb0 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
15fc0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
15fd0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
15fe0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
15ff0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
16000 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
16010 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16020 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
16030 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
16040 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
16050 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
16060 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16070 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
16080 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
16090 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
160a0 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
160b0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
160c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
160d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
160e0 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
160f0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
16100 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
16110 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
16120 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
16130 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
16140 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
16150 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
16160 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
16170 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
16180 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
16190 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
161a0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
161b0 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
161c0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
161d0 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
161e0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
161f0 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
16200 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
16210 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
16220 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
16230 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
16240 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
16250 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
16260 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
16270 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
16280 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
16290 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
162a0 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
162b0 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
162c0 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
162d0 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
162e0 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
162f0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
16300 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
16310 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
16320 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
16330 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
16340 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
16350 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
16360 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16370 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73  eDeleteAuxData(s
16380 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44  qlite3 *db, AuxD
16390 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f  ata **pp, int iO
163a0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
163b0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
163c0 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
163d0 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
163e0 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
163f0 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
16400 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
16410 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
16420 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
16430 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
16440 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
16450 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
16460 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
16470 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
16480 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
16490 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
164a0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
164b0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
164c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
164d0 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  e(db, pAux);.   
164e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
164f0 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
16500 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
16510 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
16520 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
16530 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
16540 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
16550 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
16560 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
16570 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
16580 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
16590 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
165a0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
165b0 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
165c0 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
165d0 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
165e0 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
165f0 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
16600 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
16610 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
16620 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
16630 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
16640 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
16650 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
16660 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
16670 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
16680 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
16690 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
166a0 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
166b0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
166c0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
166d0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
166e0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
166f0 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
16700 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
16710 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
16720 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
16730 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
16740 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
16750 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
16760 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
16770 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
16780 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
16790 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
167a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61  .  }.  if( p->ma
167b0 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
167c0 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65  INIT ){.    rele
167d0 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
167e0 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
167f0 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61     for(i=p->nzVa
16800 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  r-1; i>=0; i--) 
16810 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16820 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a  , p->azVar[i]);.
16830 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16840 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 29 3b  e(db, p->azVar);
16850 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16860 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
16870 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65  ;.  }.  vdbeFree
16880 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
16890 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
168a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
168b0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
168c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
168d0 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66  b, p->zSql);.#if
168e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
168f0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
16900 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  S.  for(i=0; i<p
16910 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
16920 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16930 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
16940 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
16950 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16960 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64   p->aScan);.#end
16970 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
16980 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
16990 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
169a0 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
169b0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
169c0 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
169d0 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
169e0 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
169f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16a00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
16a10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
16a20 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
16a30 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
16a40 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
16a50 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
16a60 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
16a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
16a80 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
16a90 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
16aa0 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
16ab0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
16ac0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
16ad0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
16ae0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
16af0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
16b00 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
16b10 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
16b20 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
16b30 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
16b40 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
16b50 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
16b60 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
16b70 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
16b80 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
16b90 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
16ba0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
16bb0 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
16bc0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
16bd0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
16be0 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
16bf0 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
16c00 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
16c10 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
16c20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
16c30 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
16c40 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
16c50 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
16c60 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
16c70 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
16c80 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
16c90 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
16ca0 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
16cb0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
16cc0 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
16cd0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 49 6e  te3BtreeMovetoIn
16ce0 74 6b 65 79 28 70 2d 3e 75 63 2e 70 43 75 72 73  tkey(p->uc.pCurs
16cf0 6f 72 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  or, p->movetoTar
16d00 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
16d10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16d20 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d   rc;.  if( res!=
16d30 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
16d40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
16d50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16d60 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  ST.  sqlite3_sea
16d70 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
16d80 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65  dif.  p->deferre
16d90 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70  dMoveto = 0;.  p
16da0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
16db0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72  CACHE_STALE;.  r
16dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68  .}../*.** Someth
16de0 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75  ing has moved cu
16df0 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20  rsor "p" out of 
16e00 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68  place.  Maybe th
16e10 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20  e row it was.** 
16e20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64  pointed to was d
16e30 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
16e40 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61  under it.  Or ma
16e50 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61  ybe the btree wa
16e60 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e  s.** rebalanced.
16e70 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63    Whatever the c
16e80 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73  ause, try to res
16e90 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20  tore "p" to the 
16ea0 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73  place it.** is s
16eb0 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f  upposed to be po
16ec0 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  inting.  If the 
16ed0 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20  row was deleted 
16ee0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
16ef0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65  he.** cursor, se
16f00 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  t the cursor to 
16f10 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20  point to a NULL 
16f20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
16f30 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
16f40 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  NE handleMovedCu
16f50 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20  rsor(VdbeCursor 
16f60 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66  *p){.  int isDif
16f70 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20  ferentRow, rc;. 
16f80 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
16f90 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
16fa0 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
16fb0 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d   p->uc.pCursor!=
16fc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
16fd0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
16fe0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
16ff0 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63  pCursor) );.  rc
17000 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
17010 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e  ursorRestore(p->
17020 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44  uc.pCursor, &isD
17030 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20  ifferentRow);.  
17040 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
17050 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
17060 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52  if( isDifferentR
17070 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  ow ) p->nullRow 
17080 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
17090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
170a0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
170b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61  the cursor is va
170c0 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68  lid.  Restore th
170d0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e  e cursor.** if n
170e0 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20  eed be.  Return 
170f0 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72  any I/O error fr
17100 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f  om the restore o
17110 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
17120 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
17130 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75  orRestore(VdbeCu
17140 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
17150 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
17160 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
17170 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  ;.  if( sqlite3B
17180 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
17190 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
171a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
171b0 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
171c0 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
171d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
171e0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
171f0 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
17200 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
17210 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
17220 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
17230 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
17240 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
17250 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
17260 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
17270 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
17280 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
17290 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
172a0 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
172b0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
172c0 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
172d0 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
172e0 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
172f0 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
17300 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
17310 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
17320 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
17330 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
17340 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
17350 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
17360 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
17370 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
17380 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
17390 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
173a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
173b0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
173c0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
173d0 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
173e0 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
173f0 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
17400 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
17410 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
17420 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17430 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
17440 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
17450 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
17460 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43  r **pp, int *piC
17470 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  ol){.  VdbeCurso
17480 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 66  r *p = *pp;.  if
17490 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
174a0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a  URTYPE_BTREE ){.
174b0 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72      if( p->defer
174c0 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
174d0 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20     int iMap;.   
174e0 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61     if( p->aAltMa
174f0 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e  p && (iMap = p->
17500 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c  aAltMap[1+*piCol
17510 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
17520 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72  *pp = p->pAltCur
17530 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  sor;.        *pi
17540 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
17550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17570 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  }.      return h
17580 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
17590 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  eto(p);.    }.  
175a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
175b0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
175c0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
175d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
175e0 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
175f0 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r(p);.    }.  }.
17600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17610 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
17620 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
17630 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
17640 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17650 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
17660 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
17670 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17680 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
17690 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
176a0 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
176b0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
176c0 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
176d0 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
176e0 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
176f0 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
17700 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
17710 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
17720 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
17730 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
17740 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
17750 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
17760 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
17770 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
17780 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
17790 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
177a0 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
177b0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
177c0 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
177d0 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
177e0 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
177f0 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
17800 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
17810 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
17820 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
17830 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
17840 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
17850 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
17860 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
17870 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
17880 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
17890 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
178a0 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
178b0 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
178c0 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
178d0 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
178e0 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
178f0 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
17900 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
17910 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
17920 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
17930 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
17940 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
17950 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
17960 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
17970 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
17980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
17990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
179a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
179b0 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
179e0 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
17a10 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17a20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
17a30 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
17a40 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17a50 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
17a80 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17a90 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
17ab0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17ac0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17ad0 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
17ae0 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
17af0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17b00 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
17b30 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17b40 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
17b50 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
17b60 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
17b70 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b90 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
17ba0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17bb0 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
17be0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
17bf0 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
17c20 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
17c30 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
17c40 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
17c50 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
17c60 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
17c70 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
17c80 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
17c90 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
17ca0 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
17cb0 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
17cc0 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
17cd0 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
17ce0 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
17cf0 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
17d00 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
17d10 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
17d20 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
17d30 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
17d40 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
17d50 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
17d60 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
17d70 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
17d80 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a  le_format, u32 *
17d90 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pLen){.  int fla
17da0 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
17db0 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73  ;.  u32 n;..  as
17dc0 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b  sert( pLen!=0 );
17dd0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
17de0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Null ){.    *pL
17df0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  en = 0;.    retu
17e00 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
17e10 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
17e20 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
17e30 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
17e40 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
17e50 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
17e60 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
17e70 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
17e80 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
17e90 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
17ea0 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
17eb0 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
17ec0 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20      u = ~i;.    
17ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
17ee0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
17ef0 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  ( u<=127 ){.    
17f00 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26    if( (i&1)==i &
17f10 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
17f20 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65   ){.        *pLe
17f30 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  n = 0;.        r
17f40 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a  eturn 8+(u32)u;.
17f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17f60 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a       *pLen = 1;.
17f70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
17f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17f90 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
17fa0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72   ){ *pLen = 2; r
17fb0 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69  eturn 2; }.    i
17fc0 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b  f( u<=8388607 ){
17fd0 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75   *pLen = 3; retu
17fe0 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 3; }.    if( 
17ff0 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  u<=2147483647 ){
18000 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75   *pLen = 4; retu
18010 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 4; }.    if( 
18020 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20  u<=MAX_6BYTE ){ 
18030 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72  *pLen = 6; retur
18040 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e  n 5; }.    *pLen
18050 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
18060 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
18070 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
18080 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
18090 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
180a0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
180b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
180c0 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f  d || flags&(MEM_
180d0 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
180e0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
180f0 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28  >n>=0 );.  n = (
18100 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  u32)pMem->n;.  i
18110 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
18120 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
18130 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
18140 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a   }.  *pLen = n;.
18150 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
18160 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
18170 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
18180 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73  ./*.** The sizes
18190 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65   for serial type
181a0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a  s less than 128.
181b0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
181c0 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  u8 sqlite3SmallT
181d0 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20  ypeSizes[] = {. 
181e0 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31         /*  0   1
181f0 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35     2   3   4   5
18200 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39     6   7   8   9
18210 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f   */   ./*   0 */
18220 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33     0,  1,  2,  3
18230 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38  ,  4,  6,  8,  8
18240 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30  ,  0,  0,./*  10
18250 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
18260 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c    0,  1,  1,  2,
18270 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20    2,  3,  3,./* 
18280 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20   20 */   4,  4, 
18290 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20   5,  5,  6,  6, 
182a0 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a   7,  7,  8,  8,.
182b0 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20  /*  30 */   9,  
182c0 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31  9, 10, 10, 11, 1
182d0 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31  1, 12, 12, 13, 1
182e0 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34  3,./*  40 */  14
182f0 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36  , 14, 15, 15, 16
18300 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38  , 16, 17, 17, 18
18310 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20  , 18,./*  50 */ 
18320 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c   19, 19, 20, 20,
18330 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c   21, 21, 22, 22,
18340 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20   23, 23,./*  60 
18350 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20  */  24, 24, 25, 
18360 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20  25, 26, 26, 27, 
18370 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20  27, 28, 28,./*  
18380 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33  70 */  29, 29, 3
18390 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33  0, 30, 31, 31, 3
183a0 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f  2, 32, 33, 33,./
183b0 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34  *  80 */  34, 34
183c0 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36  , 35, 35, 36, 36
183d0 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38  , 37, 37, 38, 38
183e0 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c  ,./*  90 */  39,
183f0 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c   39, 40, 40, 41,
18400 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c   41, 42, 42, 43,
18410 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20   43,./* 100 */  
18420 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20  44, 44, 45, 45, 
18430 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20  46, 46, 47, 47, 
18440 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a  48, 48,./* 110 *
18450 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35  /  49, 49, 50, 5
18460 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35  0, 51, 51, 52, 5
18470 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32  2, 53, 53,./* 12
18480 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35  0 */  54, 54, 55
18490 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37  , 55, 56, 56, 57
184a0 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  , 57.};../*.** R
184b0 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
184c0 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
184d0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
184e0 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
184f0 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
18500 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18510 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
18520 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
18530 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38  serial_type>=128
18540 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
18550 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
18560 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
18570 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
18580 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20  ype<12 .        
18590 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d      || sqlite3Sm
185a0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
185b0 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69  ial_type]==(seri
185c0 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20  al_type - 12)/2 
185d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
185e0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
185f0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
18600 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74  ;.  }.}.u8 sqlit
18610 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72  e3VdbeOneByteSer
18620 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65  ialTypeLen(u8 se
18630 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73  rial_type){.  as
18640 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
18650 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72  e<128 );.  retur
18660 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
18670 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18680 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ype];  .}../*.**
18690 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
186a0 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
186b0 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
186c0 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
186d0 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
186e0 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
186f0 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
18700 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
18710 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
18720 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
18730 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
18740 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
18750 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
18760 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
18770 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
18780 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
18790 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
187a0 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
187b0 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
187c0 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
187d0 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
187e0 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
187f0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
18800 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
18810 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
18820 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
18830 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
18840 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
18850 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
18860 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
18870 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
18880 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
18890 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
188a0 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
188b0 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
188c0 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
188d0 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
188e0 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
188f0 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
18900 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
18910 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
18920 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
18930 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
18940 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
18950 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
18960 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
18970 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
18980 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
18990 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
189a0 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
189b0 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
189c0 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
189d0 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
189e0 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
189f0 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
18a00 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
18a10 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
18a20 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
18a30 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
18a40 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
18a50 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
18a60 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
18a70 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
18a80 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
18a90 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
18aa0 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
18ab0 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
18ac0 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
18ad0 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
18ae0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
18af0 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
18b00 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
18b10 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
18b20 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
18b30 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
18b40 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
18b50 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
18b60 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
18b70 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
18b80 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
18b90 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
18ba0 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
18bb0 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
18bc0 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
18bd0 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
18be0 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
18bf0 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
18c00 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
18c10 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
18c20 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
18c30 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
18c40 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
18c50 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
18c60 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
18c70 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
18c80 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
18c90 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
18ca0 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
18cb0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
18cc0 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
18cd0 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
18ce0 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
18cf0 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
18d00 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
18d10 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
18d20 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
18d30 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
18d40 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
18d50 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
18d60 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
18d70 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
18d80 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
18d90 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
18da0 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
18db0 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
18dc0 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
18dd0 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
18de0 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
18df0 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
18e00 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
18e10 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
18e20 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
18e30 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
18e40 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
18e50 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
18e60 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
18e70 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
18e80 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
18e90 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
18ea0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
18eb0 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
18ec0 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
18ed0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18ee0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
18ef0 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
18f00 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
18f10 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
18f20 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
18f30 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
18f40 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
18f50 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
18f60 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
18f70 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
18f80 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
18f90 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
18fa0 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
18fb0 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
18fc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18fd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
18fe0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
18ff0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
19000 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
19010 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
19020 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
19030 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
19040 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
19050 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
19060 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
19070 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
19080 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19090 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
190a0 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
190b0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
190c0 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
190d0 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
190e0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
190f0 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
19100 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
19110 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
19120 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
19130 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
19140 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
19150 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
19160 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
19170 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
19180 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
19190 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
191a0 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
191b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
191c0 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
191d0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
191e0 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
191f0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
19200 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72  type];.    asser
19210 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f  t( i>0 );.    do
19220 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d  {.      buf[--i]
19230 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
19240 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
19250 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b      }while( i );
19260 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
19270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
19280 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
19290 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
192a0 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
192b0 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
192c0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
192d0 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
192e0 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
192f0 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
19300 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
19310 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
19320 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
19330 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20  Mem->n;.    if( 
19340 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62  len>0 ) memcpy(b
19350 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
19360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
19370 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
19380 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
19390 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
193a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74  n 0;.}../* Input
193b0 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e   "x" is a sequen
193c0 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63  ce of unsigned c
193d0 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72  haracters that r
193e0 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69  epresent a.** bi
193f0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
19400 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71  .  Return the eq
19410 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20  uivalent native 
19420 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69  integer.*/.#defi
19430 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  ne ONE_BYTE_INT(
19440 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30  x)    ((i8)(x)[0
19450 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42  ]).#define TWO_B
19460 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32  YTE_INT(x)    (2
19470 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  56*(i8)((x)[0])|
19480 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[1]).#define 
19490 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78  THREE_BYTE_INT(x
194a0 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28  )  (65536*(i8)((
194b0 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
194c0 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69  8)|(x)[2]).#defi
194d0 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  ne FOUR_BYTE_UIN
194e0 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29  T(x)  (((u32)(x)
194f0 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d  [0]<<24)|((x)[1]
19500 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
19510 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e  )|(x)[3]).#defin
19520 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  e FOUR_BYTE_INT(
19530 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38  x) (16777216*(i8
19540 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
19550 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
19560 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a  8)|(x)[3])../*.*
19570 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
19580 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
19590 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
195a0 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
195b0 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
195c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
195d0 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
195e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
195f0 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  bytes read..**.*
19600 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19610 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
19620 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72  s two separate r
19630 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66  outines for perf
19640 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
19650 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72  few cases that r
19660 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72  equire local var
19670 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65  iables are broke
19680 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70  n out into a sep
19690 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65  arate.** routine
196a0 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74   so that in most
196b0 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68   cases the overh
196c0 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68  ead of moving th
196d0 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a  e stack pointer.
196e0 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a  ** is avoided..*
196f0 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51  / .static u32 SQ
19700 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65  LITE_NOINLINE se
19710 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
19720 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19730 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
19740 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19750 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
19760 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
19770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19780 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19790 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
197a0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
197b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
197c0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
197d0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
197e0 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f  .){.  u64 x = FO
197f0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
19800 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55  );.  u32 y = FOU
19810 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
19820 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32  4);.  x = (x<<32
19830 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72  ) + y;.  if( ser
19840 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
19850 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19860 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32  F: R-29851-52272
19870 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19880 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20  endian 64-bit.  
19890 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
198a0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
198b0 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
198c0 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
198d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
198e0 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63  M_Int;.    testc
198f0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19900 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
19910 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19920 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56   R-57343-49114 V
19930 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19940 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30  dian IEEE 754-20
19950 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  08 64-bit.    **
19960 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19970 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21  number. */.#if !
19980 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
19990 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
199a0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
199b0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56  _POINT).    /* V
199c0 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
199d0 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
199e0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
199f0 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  e the same.    *
19a00 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
19a10 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
19a20 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
19a30 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
19a40 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
19a50 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
19a60 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
19a70 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
19a80 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
19a90 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
19aa0 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
19ab0 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
19ac0 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69  )<<32;.    stati
19ad0 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
19ae0 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34  1 = 1.0;.    u64
19af0 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77   t2 = t1;.    sw
19b00 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
19b10 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65  at(t2);.    asse
19b20 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
19b30 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
19b40 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
19b50 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
19b60 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
19b70 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
19b80 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
19b90 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  >u.r)==8 );.    
19ba0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19bb0 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d  loat(x);.    mem
19bc0 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  cpy(&pMem->u.r, 
19bd0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
19be0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19bf0 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
19c00 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f  Mem->u.r) ? MEM_
19c10 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
19c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b  .  }.  return 8;
19c30 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  .}.u32 sqlite3Vd
19c40 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
19c50 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19c60 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
19c70 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
19c80 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
19c90 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19cb0 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
19cc0 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
19cd0 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19cf0 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
19d00 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
19d10 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
19d20 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
19d30 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
19d40 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
19d50 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
19d60 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
19d70 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
19d80 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
19d90 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c  ase 0: {  /* Nul
19da0 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  l */.      /* EV
19db0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
19dc0 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69  78-09375 Value i
19dd0 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20  s a NULL. */.   
19de0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19df0 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
19e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19e10 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
19e20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19e30 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20  : R-44885-25196 
19e40 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69  Value is an 8-bi
19e50 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
19e60 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  t.      ** integ
19e70 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19e80 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
19e90 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
19ea0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19eb0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19ec0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19ed0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19ee0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
19ef0 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
19f00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19f10 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
19f20 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19f30 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75  49794-35026 Valu
19f40 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19f50 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 16-bit.      *
19f60 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
19f70 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
19f80 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19f90 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
19fa0 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19fb0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19fc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19fd0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19fe0 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
19ff0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
1a000 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
1a010 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a020 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a030 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33  -OF: R-37839-543
1a040 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  01 Value is a bi
1a050 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a  g-endian 24-bit.
1a060 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1a070 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1a080 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a090 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
1a0a0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a0b0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a0c0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a0d0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a0e0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a0f0 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
1a100 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1a110 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a120 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a130 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a140 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75  01849-26079 Valu
1a150 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a160 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 32-bit.      *
1a170 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a180 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a190 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a1a0 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75  FOUR_BYTE_INT(bu
1a1b0 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f  f);.#ifdef __HP_
1a1c0 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72  cc .      /* Wor
1a1d0 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d  k around a sign-
1a1e0 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e  extension bug in
1a1f0 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72   the HP compiler
1a200 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20   for HP/UX */.  
1a210 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30      if( buf[0]&0
1a220 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20  x80 ) pMem->u.i 
1a230 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30  |= 0xffffffff800
1a240 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a  00000LL;.#endif.
1a250 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a260 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1a270 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1a280 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1a290 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
1a2a0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1a2b0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1a2c0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1a2d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a2e0 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
1a2f0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1a300 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
1a310 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1a320 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1a330 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1a340 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
1a350 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
1a360 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1a370 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a380 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a390 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a3a0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a3b0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a3c0 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
1a3d0 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
1a3e0 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1a3f0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
1a400 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
1a410 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
1a420 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
1a430 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
1a440 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
1a450 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
1a460 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1a470 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
1a480 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
1a490 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
1a4a0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
1a4b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
1a4c0 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
1a4d0 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
1a4e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
1a4f0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
1a500 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
1a510 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
1a520 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a530 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
1a540 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
1a550 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
1a560 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a570 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
1a580 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
1a590 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
1a5a0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a5b0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
1a5c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1a5d0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1a5e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a5f0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
1a600 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
1a610 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
1a620 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
1a630 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
1a640 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
1a650 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
1a660 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
1a670 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
1a680 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
1a690 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
1a6a0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
1a6b0 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
1a6c0 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
1a6d0 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
1a6e0 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
1a6f0 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
1a700 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
1a710 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
1a720 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
1a730 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
1a740 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1a750 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1a760 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
1a770 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
1a780 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
1a790 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
1a7a0 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
1a7b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
1a7c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1a7d0 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
1a7e0 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
1a7f0 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
1a800 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
1a810 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
1a820 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
1a830 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
1a840 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
1a850 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
1a860 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1a870 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
1a880 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
1a890 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
1a8a0 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
1a8b0 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
1a8c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a8d0 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
1a8e0 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
1a8f0 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
1a900 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
1a910 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
1a920 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
1a930 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
1a940 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
1a950 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
1a960 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
1a970 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
1a980 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
1a990 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1a9a0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1a9b0 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
1a9c0 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
1a9d0 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
1a9e0 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
1a9f0 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
1aa00 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
1aa10 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
1aa20 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1aa30 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1aa40 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1aa50 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
1aa60 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
1aa70 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
1aa80 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
1aa90 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1aaa0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
1aab0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
1aac0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
1aad0 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
1aae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1aaf0 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
1ab00 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
1ab10 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab30 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
1ab40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
1ab50 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab70 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
1ab80 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
1ab90 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
1aba0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1abb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1abc0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1abd0 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1abe0 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac00 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
1ac10 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
1ac20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
1ac30 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac50 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1ac60 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
1ac70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
1ac80 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
1ac90 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
1aca0 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
1acb0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
1acc0 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
1acd0 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
1ace0 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
1acf0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
1ad00 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
1ad10 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
1ad20 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
1ad30 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
1ad40 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
1ad50 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
1ad60 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
1ad70 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
1ad80 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
1ad90 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
1ada0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1adb0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
1adc0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
1add0 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
1ade0 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
1adf0 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
1ae00 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
1ae10 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1ae20 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
1ae30 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
1ae40 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
1ae50 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
1ae60 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1ae70 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1ae80 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
1ae90 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
1aea0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
1aeb0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1aec0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1aed0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1aee0 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1aef0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1af00 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1af10 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1af20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1af30 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1af40 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
1af50 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1af60 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
1af70 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
1af80 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
1af90 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
1afa0 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
1afb0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
1afc0 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
1afd0 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
1afe0 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
1aff0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1b000 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
1b010 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
1b020 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1b030 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
1b040 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
1b050 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1b060 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
1b070 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b090 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
1b0a0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
1b0b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b0c0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
1b0d0 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
1b0e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1b0f0 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
1b100 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
1b110 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
1b120 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
1b130 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b140 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1b150 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1b160 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
1b170 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
1b1a0 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
1b1b0 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1b1e0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1b1f0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
1b200 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
1b210 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
1b220 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
1b230 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1b240 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
1b250 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
1b260 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1b270 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
1b280 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
1b290 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1b2a0 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
1b2b0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1b2c0 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
1b2d0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1b2e0 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
1b2f0 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
1b300 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1b310 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
1b320 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1b330 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
1b340 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
1b350 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b360 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
1b370 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
1b380 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
1b390 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   0;.    pMem->z 
1b3a0 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
1b3b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b3c0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
1b3d0 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
1b3e0 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
1b3f0 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e   if( (++u)>=p->n
1b400 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20  Field ) break;. 
1b410 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
1b420 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b430 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
1b440 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20  eld = u;.}..#if 
1b450 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1b460 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b470 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
1b480 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
1b490 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
1b4a0 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1b4b0 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1b4c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1b4d0 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1b4e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1b4f0 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1b500 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1b510 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1b520 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1b530 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1b540 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1b550 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1b560 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1b570 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1b580 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b590 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1b5a0 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1b5b0 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1b5c0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b5d0 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1b5e0 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1b5f0 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1b600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1b610 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1b620 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1b630 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1b640 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1b650 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1b660 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1b670 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1b680 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1b690 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1b6a0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1b6b0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1b6c0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1b6d0 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1b6e0 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1b6f0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1b700 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1b710 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1b720 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1b730 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1b740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1b750 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1b760 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1b770 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1b780 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1b790 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1b7a0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1b7b0 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1b7c0 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1b7d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b7e0 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1b7f0 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1b800 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1b810 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b820 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1b830 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1b840 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1b850 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1b860 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1b870 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1b880 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1b890 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1b8a0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1b8b0 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1b8c0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1b8d0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1b8e0 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1b8f0 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1b900 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1b910 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1b920 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1b930 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1b940 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1b950 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1b960 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1b970 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1b980 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1b990 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1b9a0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1b9b0 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1b9c0 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1b9d0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1b9e0 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1b9f0 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1ba00 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1ba10 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1ba20 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1ba30 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1ba40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1ba50 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1ba60 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1ba70 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1ba80 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1ba90 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1baa0 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1bab0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1bac0 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1bad0 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1bae0 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1baf0 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1bb00 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1bb10 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1bb20 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1bb30 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1bb40 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1bb50 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1bb60 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1bb70 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1bb80 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1bb90 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1bba0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1bbb0 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1bbc0 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1bbd0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1bbe0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1bbf0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1bc00 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1bc10 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1bc20 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1bc30 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1bc40 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1bc50 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1bc60 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1bc70 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1bc80 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1bc90 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1bca0 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1bcb0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1bcc0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1bcd0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1bce0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1bcf0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1bd00 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1bd10 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1bd20 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1bd30 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1bd40 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1bd50 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1bd60 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1bd70 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1bd80 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1bd90 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1bda0 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1bdb0 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1bdc0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1bdd0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1bde0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1bdf0 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1be00 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1be10 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1be20 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1be30 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1be40 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1be50 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1be60 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1be70 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1be80 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1be90 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
1bea0 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
1beb0 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
1bec0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1bed0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1bee0 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
1bef0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1bf00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1bf10 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1bf20 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1bf30 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1bf40 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1bf50 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1bf60 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1bf70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1bf80 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1bf90 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1bfa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1bfb0 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1bfc0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1bfd0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1bfe0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
1bff0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1c000 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c010 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1c020 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1c030 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
1c040 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1c050 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1c060 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
1c070 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
1c080 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
1c090 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
1c0a0 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
1c0b0 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
1c0c0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
1c0d0 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
1c0e0 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1c0f0 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
1c100 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1c110 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1c120 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1c130 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1c140 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1c150 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1c160 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1c170 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1c180 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1c190 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1c1a0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1c1b0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1c1c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1c1d0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1c1e0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1c1f0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1c200 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
1c210 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1c220 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1c230 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1c240 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1c250 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1c260 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1c270 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
1c280 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1c290 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
1c2a0 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
1c2b0 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
1c2c0 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
1c2d0 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1c2e0 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
1c2f0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
1c300 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c310 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
1c320 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
1c330 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1c340 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
1c350 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1c360 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1c370 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
1c380 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1c390 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1c3a0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1c3b0 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e   of fields (a.k.
1c3c0 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74  a. columns) in t
1c3d0 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20  he record given 
1c3e0 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e  by.** pKey,nKey.
1c3f0 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61    The verify tha
1c400 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20  t this count is 
1c410 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1c420 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d  al to the.** lim
1c430 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79  it given by pKey
1c440 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70  Info->nField + p
1c450 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1c460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1c470 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1c480 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1c490 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1c4a0 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1c4b0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1c4c0 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1c4d0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1c4e0 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1c4f0 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1c500 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1c510 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1c520 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1c530 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1c540 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c  he KeyInfo.nFiel
1c550 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46  d or KeyInfo.nXF
1c560 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65  ield values were
1c570 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63   computed.** inc
1c580 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
1c590 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73  tic void vdbeAss
1c5a0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1c5b0 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74  hinLimits(.  int
1c5c0 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69   nKey, const voi
1c5d0 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68  d *pKey,   /* Th
1c5e0 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69  e record to veri
1c5f0 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b  fy */ .  const K
1c600 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1c610 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1c620 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73  e size with this
1c630 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20   KeyInfo */.){. 
1c640 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b   int nField = 0;
1c650 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
1c660 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e  u32 idx;.  u32 n
1c670 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20  otUsed;.  const 
1c680 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1c690 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
1c6a0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79  igned char*)pKey
1c6b0 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ;..  if( CORRUPT
1c6c0 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _DB ) return;.  
1c6d0 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1c6e0 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1c6f0 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d    assert( nKey>=
1c700 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1c710 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20  zHdr<=(u32)nKey 
1c720 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  );.  while( idx<
1c730 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78  szHdr ){.    idx
1c740 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1c750 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65  aKey+idx, notUse
1c760 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b  d);.    nField++
1c770 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1c780 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e  nField <= pKeyIn
1c790 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1c7a0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a  nfo->nXField );.
1c7b0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1c7c0 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1c7d0 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1c7e0 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1c7f0 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1c800 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1c810 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1c820 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1c830 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1c840 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1c850 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1c860 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1c870 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1c880 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1c890 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1c8a0 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1c8b0 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1c8c0 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1c8d0 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1c8e0 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1c8f0 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1c900 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1c910 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1c920 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1c930 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1c940 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1c950 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1c960 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1c970 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1c980 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c9a0 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1c9b0 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1c9c0 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1c9d0 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1c9e0 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1c9f0 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1ca00 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1ca10 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1ca20 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1ca30 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1ca40 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1ca50 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1ca60 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1ca70 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1ca80 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1ca90 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1caa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1cab0 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1cac0 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1cad0 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20     int n1, n2;. 
1cae0 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1caf0 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1cb00 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1cb10 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1cb20 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1cb30 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1cb40 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1cb50 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1cb60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1cb70 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1cb80 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1cb90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cba0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1cbb0 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1cbc0 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1cbd0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1cbe0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1cbf0 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1cc00 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d  );.    n1 = v1==
1cc10 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20  0 ? 0 : c1.n;.  
1cc20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1cc30 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1cc40 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1cc50 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32  ll->enc);.    n2
1cc60 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63   = v2==0 ? 0 : c
1cc70 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43  2.n;.    rc = pC
1cc80 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1cc90 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20  >pUser, n1, v1, 
1cca0 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 69 66 28  n2, v2);.    if(
1ccb0 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30   (v1==0 || v2==0
1ccc0 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70  ) && prcErr ) *p
1ccd0 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1cce0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
1ccf0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1cd00 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1cd10 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1cd20 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
1cd30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1cd40 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
1cd50 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e   pBlob is guaran
1cd60 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f  teed to be a Blo
1cd70 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61  b that is not ma
1cd80 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d  rked.** with MEM
1cd90 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74  _Zero.  Return t
1cda0 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20  rue if it could 
1cdb0 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a  be a zero-blob..
1cdc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
1cdd0 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68  AllZero(const ch
1cde0 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
1cdf0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1ce00 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1ce10 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74    if( z[i] ) ret
1ce20 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1ce30 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1ce40 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62  Compare two blob
1ce50 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
1ce60 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1ce70 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1ce80 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  rst.** is less t
1ce90 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1cea0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1ceb0 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65  he second, respe
1cec0 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f  ctively..** If o
1ced0 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65  ne blob is a pre
1cee0 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
1cef0 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74  , then the short
1cf00 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72  er is the lessor
1cf10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
1cf20 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
1cf30 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1cf40 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42  re(const Mem *pB
1cf50 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42  1, const Mem *pB
1cf60 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  2){.  int c;.  i
1cf70 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a  nt n1 = pB1->n;.
1cf80 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e    int n2 = pB2->
1cf90 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70  n;..  /* It is p
1cfa0 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
1cfb0 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61  a Blob value tha
1cfc0 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a  t has some non-z
1cfd0 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  ero content.  **
1cfe0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72   followed by zer
1cff0 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20  o content.  But 
1d000 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20  that only comes 
1d010 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72  up for Blobs for
1d020 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  med.  ** by the 
1d030 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1d040 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42  code, and such B
1d050 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20 70  lobs never get p
1d060 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  assed into.  ** 
1d070 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1d080 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  e(). */.  assert
1d090 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20  ( (pB1->flags & 
1d0a0 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
1d0b0 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  n1==0 );.  asser
1d0c0 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26  t( (pB2->flags &
1d0d0 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
1d0e0 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28   n2==0 );..  if(
1d0f0 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32   (pB1->flags|pB2
1d100 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a  ->flags) & MEM_Z
1d110 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ero ){.    if( p
1d120 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d  B1->flags & pB2-
1d130 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d140 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  o ){.      retur
1d150 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d  n pB1->u.nZero -
1d160 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20   pB2->u.nZero;. 
1d170 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31     }else if( pB1
1d180 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1d190 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ro ){.      if( 
1d1a0 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e  !isAllZero(pB2->
1d1b0 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74  z, pB2->n) ) ret
1d1c0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  urn -1;.      re
1d1d0 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72  turn pB1->u.nZer
1d1e0 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73  o - n2;.    }els
1d1f0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  e{.      if( !is
1d200 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20  AllZero(pB1->z, 
1d210 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e  pB1->n) ) return
1d220 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1d230 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a  n n1 - pB2->u.nZ
1d240 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ero;.    }.  }. 
1d250 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
1d260 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e  >z, pB2->z, n1>n
1d270 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20  2 ? n2 : n1);.  
1d280 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
1d290 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20  ;.  return n1 - 
1d2a0 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  n2;.}../*.** Do 
1d2b0 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
1d2c0 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69  ween a 64-bit si
1d2d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64  gned integer and
1d2e0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
1d2f0 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62  ng-point.** numb
1d300 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  er.  Return nega
1d310 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1d320 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1d330 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65  irst (i64) is le
1d340 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61  ss than,.** equa
1d350 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1d360 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1d370 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74   (double)..*/.st
1d380 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1d390 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1d3a0 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29  i64 i, double r)
1d3b0 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  {.  if( sizeof(L
1d3c0 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e  ONGDOUBLE_TYPE)>
1d3d0 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55  8 ){.    LONGDOU
1d3e0 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f  BLE_TYPE x = (LO
1d3f0 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b  NGDOUBLE_TYPE)i;
1d400 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72  .    if( x<r ) r
1d410 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1d420 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( x>r ) return +
1d430 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1d440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
1d450 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  4 y;.    double 
1d460 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32  s;.    if( r<-92
1d470 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1d480 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  8.0 ) return +1;
1d490 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32 33 33  .    if( r>92233
1d4a0 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30  72036854775807.0
1d4b0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d4c0 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20    y = (i64)r;.  
1d4d0 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75    if( i<y ) retu
1d4e0 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  rn -1;.    if( i
1d4f0 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >y ){.      if( 
1d500 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  y==SMALLEST_INT6
1d510 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74  4 && r>0.0 ) ret
1d520 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  urn -1;.      re
1d530 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  turn +1;.    }. 
1d540 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69     s = (double)i
1d550 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20  ;.    if( s<r ) 
1d560 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1d570 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20  f( s>r ) return 
1d580 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1d590 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1d5a0 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
1d5b0 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
1d5c0 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
1d5d0 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
1d5e0 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
1d5f0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1d600 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1d610 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1d620 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
1d630 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
1d640 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
1d650 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
1d660 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
1d670 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
1d680 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
1d690 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
1d6a0 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
1d6b0 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
1d6c0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
1d6d0 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
1d6e0 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
1d6f0 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
1d700 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
1d710 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1d720 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
1d730 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1d740 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1d750 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
1d760 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
1d770 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
1d780 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
1d790 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
1d7a0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
1d7b0 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
1d7c0 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
1d7d0 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
1d7e0 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
1d7f0 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28  |f2;.  assert( (
1d800 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
1d810 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
1d820 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
1d830 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
1d840 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1d850 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
1d860 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
1d870 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
1d880 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
1d890 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1d8a0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
1d8b0 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
1d8c0 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
1d8d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
1d8e0 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
1d8f0 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61   two values is a
1d900 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69   number.  */.  i
1d910 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1d920 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1d930 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  eal) ){.    if( 
1d940 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
1d950 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1d960 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
1d970 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1d980 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1d990 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
1d9a0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1d9b0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1d9c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1d9d0 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1d9e0 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b   MEM_Real)!=0 ){
1d9f0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1da00 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.r < pMem2->u
1da10 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .r ) return -1;.
1da20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1da30 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r > pMem2->u.
1da40 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1da50 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1da60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1da70 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1da80 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1da90 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1daa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1dab0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1dac0 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20  are(pMem1->u.i, 
1dad0 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem2->u.r);.   
1dae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1daf0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1db00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1db10 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29  f( (f1&MEM_Real)
1db20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1db30 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1db40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1db50 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c  rn -sqlite3IntFl
1db60 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32  oatCompare(pMem2
1db70 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e  ->u.i, pMem1->u.
1db80 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1db90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dba0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1dbb0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b  }.    return +1;
1dbc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1dbd0 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
1dbe0 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ing and the othe
1dbf0 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  r is a blob, the
1dc00 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e   string is less.
1dc10 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1dc20 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61  e strings, compa
1dc30 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  re using the col
1dc40 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
1dc50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1dc60 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1dc70 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Str ){.    if( (
1dc80 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f1 & MEM_Str)==0
1dc90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1dca0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1dcb0 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f2 & MEM_Str)
1dcc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1dcd0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
1dce0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1dcf0 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e  ->enc==pMem2->en
1dd00 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e  c || pMem1->db->
1dd10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1dd20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1dd30 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1dd40 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  TF8 || .        
1dd50 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d      pMem1->enc==
1dd60 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
1dd70 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  | pMem1->enc==SQ
1dd80 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
1dd90 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  .    /* The coll
1dda0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d  ation sequence m
1ddb0 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61  ust be defined a
1ddc0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76  t this point, ev
1ddd0 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  en if.    ** the
1dde0 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68   user deletes th
1ddf0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1de00 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76  ence after the v
1de10 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20  dbe program is. 
1de20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28     ** compiled (
1de30 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77  this was not alw
1de40 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20  ays the case).. 
1de50 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1de60 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c  ( !pColl || pCol
1de70 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20  l->xCmp );..    
1de80 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1de90 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f     return vdbeCo
1dea0 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70  mpareMemString(p
1deb0 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f  Mem1, pMem2, pCo
1dec0 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
1ded0 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
1dee0 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
1def0 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
1df00 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
1df10 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
1df20 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
1df30 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
1df40 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
1df50 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
1df60 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
1df70 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
1df80 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  p().  */.  retur
1df90 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  n sqlite3BlobCom
1dfa0 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  pare(pMem1, pMem
1dfb0 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  2);.}.../*.** Th
1dfc0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1dfd0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1dfe0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
1dff0 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
1e000 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
1e010 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
1e020 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
1e030 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
1e040 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
1e050 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
1e060 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1e070 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
1e080 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
1e090 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
1e0a0 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
1e0b0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1e0c0 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
1e0d0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
1e0e0 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1e0f0 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
1e100 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
1e110 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
1e120 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
1e130 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
1e140 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
1e150 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
1e160 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
1e170 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
1e180 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
1e190 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1e1a0 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
1e1b0 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
1e1c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1e1d0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1e1e0 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
1e1f0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1e200 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
1e210 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e220 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e230 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1e240 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
1e250 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e260 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e270 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
1e280 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1e290 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
1e2a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e2b0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e2c0 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1e2d0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1e2e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1e2f0 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1e300 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1e310 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e320 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e330 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
1e340 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e350 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1e360 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1e370 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
1e380 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
1e390 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
1e3a0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e3b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e3c0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e3d0 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1e3e0 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1e3f0 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1e400 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1e410 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
1e420 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1e430 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
1e440 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1e450 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1e460 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
1e470 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
1e480 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
1e490 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
1e4a0 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
1e4b0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
1e4c0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
1e4d0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
1e4e0 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
1e4f0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1e500 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
1e510 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
1e520 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
1e530 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
1e540 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
1e550 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1e560 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
1e570 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
1e580 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
1e590 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
1e5a0 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
1e5b0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1e5c0 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
1e5d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
1e5e0 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f  ment bSkip is no
1e5f0 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  n-zero, it is as
1e600 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1e610 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1e620 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  y.** determined 
1e630 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66  that the first f
1e640 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
1e650 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  s are equal..**.
1e660 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
1e670 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1e680 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1e690 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1e6a0 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69  s. If all .** fi
1e6b0 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72  elds that appear
1e6c0 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72   in both keys ar
1e6d0 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50  e equal, then pP
1e6e0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1e6f0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1e700 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62  ..**.** If datab
1e710 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1e720 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65  s discovered, se
1e730 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  t pPKey2->errCod
1e740 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  e to .** SQLITE_
1e750 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75  CORRUPT and retu
1e760 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  rn 0. If an OOM 
1e770 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1e780 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32  ered, .** pPKey2
1e790 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  ->errCode is set
1e7a0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1e7b0 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e   and, if it is n
1e7c0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20  ot NULL, the.** 
1e7d0 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
1e7e0 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61  ag set on databa
1e7f0 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79  se handle (pPKey
1e800 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29  2->pKeyInfo->db)
1e810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e820 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e830 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74  eWithSkip(.  int
1e840 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1e850 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
1e860 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1e870 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1e880 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a  Key2,         /*
1e890 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1e8a0 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70  /* If true, skip
1e8d0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1e8e0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e910 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1e920 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1e930 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e960 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20  x of next field 
1e970 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1e980 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
1e9b0 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  d header in byte
1e9c0 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  s */.  u32 idx1;
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1e9f0 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69   of first type i
1ea00 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1ea10 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea30 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1ea40 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70  .  Mem *pRhs = p
1ea50 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20  PKey2->aMem;    
1ea60 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64     /* Next field
1ea70 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f   of pPKey2 to co
1ea80 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  mpare */.  KeyIn
1ea90 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
1eaa0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1eab0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1eac0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1ead0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1eae0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1eaf0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
1eb00 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
1eb10 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1eb20 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
1eb30 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1eb40 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
1eb50 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1eb60 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1eb70 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
1eb80 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
1eb90 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1eba0 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
1ebb0 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
1ebc0 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
1ebd0 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
1ebe0 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
1ebf0 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
1ec00 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1ec10 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
1ec20 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
1ec30 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1ec40 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
1ec50 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
1ec60 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
1ec70 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
1ec80 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
1ec90 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1eca0 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
1ecb0 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28   szHdr1;.    if(
1ecc0 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b   d1>(unsigned)nK
1ecd0 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50  ey1 ){ .      pP
1ece0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1ecf0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1ed00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1ed10 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
1ed20 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1ed30 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a  .    i = 0;.  }.
1ed40 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1ed50 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1ed60 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1ed70 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1ed80 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
1ed90 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1eda0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
1edb0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1edc0 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1edd0 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
1ede0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1edf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1ee00 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
1ee10 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1ee20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1ee30 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1ee40 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1ee50 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1ee60 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1ee70 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1ee80 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
1ee90 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
1eea0 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1eeb0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1eec0 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1eed0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1eee0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65  [idx1];.      te
1eef0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1ef00 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1ef10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ef20 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
1ef30 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1ef40 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1ef50 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1ef60 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1ef70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1ef80 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1ef90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1efa0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1efb0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1efc0 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1efd0 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65      rc = -sqlite
1efe0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1eff0 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31  (pRhs->u.i, mem1
1f000 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  .u.r);.      }el
1f010 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
1f020 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64  lhs = vdbeRecord
1f030 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c  DecodeInt(serial
1f040 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31  _type, &aKey1[d1
1f050 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ]);.        i64 
1f060 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b  rhs = pRhs->u.i;
1f070 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73  .        if( lhs
1f080 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1f090 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f0a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73     }else if( lhs
1f0b0 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1f0c0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1f0d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f0e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1f0f0 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c  s real */.    el
1f100 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1f110 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
1f120 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1f130 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1f140 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1f150 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1f160 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1f170 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65   types 12 or gre
1f180 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73  ater are strings
1f190 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61   and blobs (grea
1f1a0 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20  ter than.       
1f1b0 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79   ** numbers). Ty
1f1c0 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72  pes 10 and 11 ar
1f1d0 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73  e currently "res
1f1e0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1f1f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65   .        ** use
1f200 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ", so it doesn't
1f210 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77   really matter w
1f220 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
1f230 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20  of comparing.   
1f240 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20       ** them to 
1f250 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20  numberic values 
1f260 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  are.  */.       
1f270 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1f280 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1f290 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1f2a0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1f2b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f2c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1f2d0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1f2e0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1f2f0 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1f300 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f310 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =7 ){.          
1f320 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68  if( mem1.u.r<pRh
1f330 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
1f340 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f350 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
1f360 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73  f( mem1.u.r>pRhs
1f370 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
1f380 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1f390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f3b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
1f3c0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d  ntFloatCompare(m
1f3d0 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75  em1.u.i, pRhs->u
1f3e0 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  .r);.        }. 
1f3f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f400 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74    /* RHS is a st
1f410 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ring */.    else
1f420 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1f430 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1f440 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1f450 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1f460 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1f470 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1f480 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1f490 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1f4a0 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20  type<12 ){.     
1f4b0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f4c0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1f4d0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1f4e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1f4f0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1f500 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  e{.        mem1.
1f510 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1f520 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1f530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1f540 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69  1+mem1.n)==(unsi
1f550 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1f560 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f570 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28  (d1+mem1.n+1)==(
1f580 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f590 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1f5a0 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73  1+mem1.n) > (uns
1f5b0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1f5c0 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1f5d0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1f5e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f5f0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1f600 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f610 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1f620 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1f630 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
1f640 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
1f650 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65            mem1.e
1f660 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1f670 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  nc;.          me
1f680 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1f690 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1f6a0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  mem1.flags = MEM
1f6b0 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  _Str;.          
1f6c0 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29  mem1.z = (char*)
1f6d0 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20  &aKey1[d1];.    
1f6e0 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
1f6f0 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1f700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
1f710 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79  mem1, pRhs, pKey
1f720 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20  Info->aColl[i], 
1f730 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65  &pPKey2->errCode
1f740 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1f750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f760 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1f770 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52  = MIN(mem1.n, pR
1f780 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1f790 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1f7a0 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1f7b0 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1f7c0 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1f7d0 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52  rc = mem1.n - pR
1f7e0 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20  hs->n; .        
1f7f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f800 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1f810 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73   blob */.    els
1f820 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1f830 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  s & MEM_Blob ){.
1f840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1f850 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1f860 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68  _Zero)==0 || pRh
1f870 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  s->n==0 );.     
1f880 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1f890 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1f8a0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1f8b0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1f8c0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1f8d0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f8e0 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f  e<12 || (serial_
1f8f0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1f900 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1f910 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f920 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d        int nStr =
1f930 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1f940 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1f950 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1f960 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  Str)==(unsigned)
1f970 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1f980 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1f990 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  Str+1)==(unsigne
1f9a0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1f9b0 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29     if( (d1+nStr)
1f9c0 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1f9d0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1f9e0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1f9f0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1fa00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1fa10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa30 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1fa40 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1fa50 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1fa60 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
1fa70 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1fa80 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ero((const char*
1fa90 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72  )&aKey1[d1],nStr
1faa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1fab0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
1fac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fad0 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20        rc = nStr 
1fae0 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b  - pRhs->u.nZero;
1faf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fb00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fb10 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1fb20 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
1fb30 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1fb40 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1fb50 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1fb60 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1fb70 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1fb80 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
1fb90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fba0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fbb0 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f  * RHS is null */
1fbc0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
1fbd0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1fbe0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1fbf0 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
1fc00 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
1fc10 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1fc20 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1fc30 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1fc40 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1fc50 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
1fc60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64        assert( vd
1fc70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1fc80 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1fc90 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29  1, pPKey2, rc) )
1fca0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fcb0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1fcc0 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1fcd0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1fce0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fcf0 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20    }..    i++;.  
1fd00 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31    pRhs++;.    d1
1fd10 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1fd20 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1fd30 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
1fd40 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61  dx1 += sqlite3Va
1fd50 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
1fd60 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
1fd70 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73  idx1<(unsigned)s
1fd80 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1fd90 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c  2->nField && d1<
1fda0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1fdb0 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1fdc0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1fdd0 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1fde0 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1fdf0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1fe00 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1fe10 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1fe20 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1fe30 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1fe40 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1fe50 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1fe60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1fe70 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f  ease(&mem1).  */
1fe80 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1fe90 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1fea0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1feb0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1fec0 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65  r both of the ke
1fed0 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1fee0 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1fef0 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1ff00 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1ff10 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1ff20 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1ff30 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1ff40 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1ff50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
1ff60 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1ff70 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1ff80 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b  ey1, pPKey2, pPK
1ff90 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29  ey2->default_rc)
1ffa0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79   .       || pKey
1ffb0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1ffc0 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50  Failed.  );.  pP
1ffd0 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31  Key2->eqSeen = 1
1ffe0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79  ;.  return pPKey
1fff0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d  2->default_rc;.}
20000 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
20010 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
20020 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
20030 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
20040 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
20050 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
20060 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
20070 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
20080 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  /.){.  return sq
20090 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
200a0 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
200b0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
200c0 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ey2, 0);.}.../*.
200d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
200e0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
200f0 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
20100 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20110 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
20120 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
20130 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
20140 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64   an integer, and
20150 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a   (b) the .** siz
20160 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
20170 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
20180 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
20190 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
201a0 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20  e.** byte (i.e. 
201b0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  is less than 128
201c0 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  )..**.** To avoi
201d0 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74  d concerns about
201e0 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
201f0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
20200 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20  is only used.** 
20210 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65  on schemas where
20220 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
20230 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  id header size i
20240 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65  s 63 bytes or le
20250 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
20260 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
20270 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b  areInt(.  int nK
20280 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
20290 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
202a0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
202b0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
202c0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
202d0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
202e0 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28  t u8 *aKey = &((
202f0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29  const u8*)pKey1)
20300 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  [*(const u8*)pKe
20310 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e  y1 & 0x3F];.  in
20320 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  t serial_type = 
20330 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
20340 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73  1)[1];.  int res
20350 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34  ;.  u32 y;.  u64
20360 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69   x;.  i64 v;.  i
20370 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41  64 lhs;..  vdbeA
20380 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
20390 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
203a0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
203b0 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61  ->pKeyInfo);.  a
203c0 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
203d0 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
203e0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
203f0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
20400 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
20410 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
20420 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20430 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
20440 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20460 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20470 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20480 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
20490 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
204a0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
204b0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
204c0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
204d0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
204e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
204f0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
20500 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
20510 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
20520 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
20530 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
20540 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
20550 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20560 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20570 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
20580 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
20590 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
205a0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
205b0 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
205c0 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
205d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
205e0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
205f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20600 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
20610 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
20620 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
20630 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20640 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
20650 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
20660 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
20670 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
20680 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20690 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
206a0 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
206b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
206c0 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
206d0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
206e0 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
206f0 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
20700 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
20710 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
20720 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
20730 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20750 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
20760 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
20770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
20780 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
20790 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
207a0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
207b0 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
207c0 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
207d0 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
207e0 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
207f0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
20800 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
20810 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
20820 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
20830 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
20840 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
20850 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
20860 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
20870 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
20880 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
20890 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
208a0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
208b0 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
208c0 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
208d0 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
208e0 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
208f0 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
20900 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
20910 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
20920 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
20930 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
20940 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
20950 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
20960 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20970 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
20980 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20  1, pPKey2);..   
20990 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
209a0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
209b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
209c0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
209d0 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20  Key2);.  }..  v 
209e0 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  = pPKey2->aMem[0
209f0 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c  ].u.i;.  if( v>l
20a00 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
20a10 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
20a20 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
20a30 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
20a40 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
20a50 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
20a60 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
20a70 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
20a80 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
20a90 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
20aa0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
20ab0 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
20ac0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
20ad0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20ae0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
20af0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20b00 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
20b10 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
20b20 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
20b30 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
20b40 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
20b50 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
20b60 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
20b70 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
20b80 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
20b90 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
20ba0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
20bb0 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  _rc;.    pPKey2-
20bc0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d  >eqSeen = 1;.  }
20bd0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
20be0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
20bf0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
20c00 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
20c10 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
20c20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20c30 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
20c40 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
20c50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20c60 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
20c70 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
20c80 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
20c90 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
20ca0 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
20cb0 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
20cc0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20cd0 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
20ce0 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
20cf0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
20d00 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
20d10 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
20d20 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
20d30 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
20d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
20d50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
20d60 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
20d70 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
20d80 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
20d90 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
20da0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
20db0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
20dc0 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
20dd0 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
20de0 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
20df0 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
20e00 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
20e10 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61  ssert( pPKey2->a
20e20 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[0].flags & M
20e30 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65  EM_Str );.  vdbe
20e40 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
20e50 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
20e60 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20e70 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
20e80 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
20e90 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
20ea0 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
20eb0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
20ec0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20ed0 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
20ee0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
20ef0 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
20f00 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
20f10 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
20f20 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
20f30 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
20f40 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
20f50 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
20f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
20f70 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
20f80 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
20f90 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
20fa0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
20fb0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
20fc0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
20fd0 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
20fe0 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
20ff0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
21000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21010 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
21020 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
21030 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
21040 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
21050 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
21060 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
21070 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
21080 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
21090 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
210a0 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
210b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
210c0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
210d0 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
210e0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
210f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
21100 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
21110 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
21120 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21130 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
21140 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
21150 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
21160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21170 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
21180 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
21190 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
211a0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  >eqSeen = 1;.   
211b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
211c0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
211d0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
211e0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
211f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
21200 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
21210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
21220 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
21230 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
21240 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
21250 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
21260 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
21270 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
21280 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21290 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
212a0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
212b0 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
212c0 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
212d0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
212e0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
212f0 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
21300 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
21310 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21320 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
21330 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
21340 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
21350 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
21360 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
21370 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
21380 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
21390 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
213a0 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
213b0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
213c0 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
213d0 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
213e0 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
213f0 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
21400 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
21410 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
21420 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
21430 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
21440 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
21450 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
21460 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
21470 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21480 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
21490 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
214a0 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
214b0 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
214c0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
214d0 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
214e0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
214f0 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
21500 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
21510 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
21520 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
21530 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
21540 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
21550 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
21560 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
21570 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
21580 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
21590 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
215a0 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
215b0 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
215c0 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
215d0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
215e0 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
215f0 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
21600 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
21610 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
21620 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
21630 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
21640 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
21650 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
21660 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
21670 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
21680 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
21690 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
216a0 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
216b0 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
216c0 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
216d0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
216e0 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
216f0 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
21700 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
21710 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
21720 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
21730 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
21740 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
21750 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
21760 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
21770 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
21780 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
21790 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
217a0 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
217b0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
217c0 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
217d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
217e0 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
217f0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
21800 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
21810 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
21820 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21830 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21840 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
21850 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
21860 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
21870 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
21880 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
21890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
218a0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
218b0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
218c0 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
218d0 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
218e0 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
218f0 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
21900 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21910 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
21920 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
21930 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
21940 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
21950 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
21960 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21970 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
21980 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
21990 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
219a0 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
219b0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
219c0 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
219d0 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
219e0 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
219f0 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
21a00 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
21a10 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
21a20 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
21a30 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
21a40 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
21a50 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
21a60 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
21a70 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
21a80 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
21a90 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
21aa0 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
21ab0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
21ac0 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
21ad0 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
21ae0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
21af0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
21b00 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
21b10 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
21b20 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
21b30 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
21b40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
21b50 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
21b60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
21b70 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
21b80 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
21b90 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
21ba0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
21bb0 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
21bc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
21bd0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
21be0 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
21bf0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
21c00 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
21c10 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
21c20 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
21c30 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
21c40 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
21c50 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
21c60 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
21c70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
21c80 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
21c90 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
21ca0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
21cb0 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
21cc0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
21cd0 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
21ce0 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
21cf0 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
21d00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21d10 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
21d20 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
21d30 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  nCellKey = sqlit
21d40 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
21d50 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65  ze(pCur);.  asse
21d60 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20  rt( (nCellKey & 
21d70 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
21d80 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29  =(u64)nCellKey )
21d90 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
21da0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
21db0 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
21dc0 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  x entry */.  sql
21dd0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
21de0 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
21df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
21e00 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
21e10 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
21e20 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
21e30 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
21e40 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
21e50 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
21e60 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
21e70 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
21e80 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
21e90 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
21ea0 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
21eb0 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
21ec0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
21ed0 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
21ee0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
21ef0 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
21f00 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
21f10 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
21f20 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
21f30 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
21f40 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
21f50 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
21f60 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
21f70 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
21f80 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
21f90 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
21fa0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
21fb0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
21fc0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
21fd0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
21fe0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21ff0 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
22000 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
22010 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22020 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
22030 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22040 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
22050 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22060 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
22070 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
22080 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22090 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
220a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
220b0 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
220c0 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
220d0 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
220e0 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
220f0 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
22100 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
22110 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
22120 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53  Rowid = sqlite3S
22130 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79  mallTypeSizes[ty
22140 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74  peRowid];.  test
22150 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
22160 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
22170 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
22180 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
22190 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
221a0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
221b0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
221c0 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
221d0 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
221e0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
221f0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
22200 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
22210 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
22220 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
22230 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
22240 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
22250 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
22260 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
22270 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
22280 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
22290 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
222a0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
222b0 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
222c0 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
222d0 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
222e0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
222f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
22300 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
22310 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
22320 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21  ase( m.szMalloc!
22330 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
22340 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
22350 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22360 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
22380 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
22390 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
223a0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
223b0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
223c0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
223d0 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
223e0 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
223f0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
22400 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
22410 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
22420 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
22430 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
22440 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
22450 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
22460 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
22470 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
22480 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
22490 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
224a0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
224b0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
224c0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
224d0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
224e0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
224f0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
22500 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
22510 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
22520 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
22530 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
22540 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
22550 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
22560 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
22570 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
22580 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
22590 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
225a0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
225b0 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69  yCompare(.  sqli
225c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
225e0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
225f0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ion */.  VdbeCur
22600 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
22610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22620 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
22630 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
22640 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
22650 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20  pUnpacked,      
22660 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
22670 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
22680 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
226b0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
226c0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
226d0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
226e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
226f0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65  rsor *pCur;.  Me
22700 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
22710 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
22720 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
22730 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70   pCur = pC->uc.p
22740 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
22750 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
22760 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
22770 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
22780 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
22790 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
227a0 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
227b0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
227c0 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
227d0 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
227e0 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
227f0 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
22800 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
22810 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
22820 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
22830 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
22840 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
22850 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
22860 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
22870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22880 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22890 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
228a0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
228b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
228c0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
228d0 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
228e0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
228f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
22910 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
22920 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22930 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e  re(m.n, m.z, pUn
22940 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74  packed);.  sqlit
22950 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
22960 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
22970 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22980 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22990 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
229a0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
229b0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
229c0 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
229d0 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
229e0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
229f0 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
22a00 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
22a10 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
22a20 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
22a30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22a40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
22a50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
22a60 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
22a70 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
22a80 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
22a90 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
22aa0 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
22ab0 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
22ac0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
22ad0 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
22ae0 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
22af0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
22b00 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
22b10 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
22b20 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
22b30 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
22b40 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
22b50 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
22b60 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
22b70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
22b80 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
22b90 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
22ba0 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
22bb0 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
22bc0 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
22bd0 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
22be0 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
22bf0 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
22c00 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
22c10 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
22c20 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
22c30 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
22c40 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
22c50 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
22c60 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
22c70 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
22c80 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
22c90 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
22ca0 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
22cb0 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
22cc0 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
22cd0 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
22ce0 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
22cf0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
22d00 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
22d10 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
22d20 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
22d30 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
22d40 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
22d50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
22d60 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
22d70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22d80 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
22d90 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
22da0 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
22db0 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
22dc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
22dd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
22de0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
22df0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
22e00 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
22e10 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
22e20 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
22e30 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
22e40 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
22e50 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
22e60 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
22e70 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
22e80 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
22e90 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
22ea0 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
22eb0 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
22ec0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
22ed0 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
22ee0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
22ef0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
22f00 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
22f10 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
22f20 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
22f30 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
22f40 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
22f50 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
22f60 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
22f70 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
22f80 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
22f90 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
22fa0 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
22fb0 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
22fc0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
22fd0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
22fe0 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
22ff0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
23000 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
23010 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
23020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
23030 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
23040 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
23050 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
23060 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
23070 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
23080 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  F8);.      }.   
23090 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
230a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
230b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
230c0 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
230d0 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
230e0 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
230f0 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
23100 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
23110 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
23120 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
23130 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
23140 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
23150 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
23160 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
23170 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
23180 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
23190 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
231a0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
231b0 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
231c0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
231d0 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
231e0 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
231f0 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
23200 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
23210 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23220 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
23230 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  LE./*.** Transfe
23240 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
23250 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c  text from an sql
23260 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73  ite3_vtab.zErrMs
23270 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
23280 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
23290 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
232a0 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61  3_malloc) into a
232b0 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74   Vdbe.zErrMsg (t
232c0 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
232d0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
232e0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
232f0 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  alloc)..*/.void 
23300 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
23310 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c  tErrmsg(Vdbe *p,
23320 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
23330 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74  Vtab){.  if( pVt
23340 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
23350 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
23360 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69   p->db;.    sqli
23370 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
23380 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
23390 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
233a0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
233b0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
233c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
233d0 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
233e0 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45  );.    pVtab->zE
233f0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d  rrMsg = 0;.  }.}
23400 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23410 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
23420 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
23430 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
23440 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a  UPDATE_HOOK../*.
23450 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
23460 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
23470 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61   NULL, release a
23480 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ny allocations a
23490 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
234a0 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  th the memory ce
234b0 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d  lls in the p->aM
234c0 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f  em[] array. Also
234d0 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b   free the Unpack
234e0 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
234f0 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73  cture itself, us
23500 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
23510 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e()..**.** This 
23520 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
23530 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65   to free Unpacke
23540 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
23550 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
23560 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63  ** the vdbeUnpac
23570 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69  kRecord() functi
23580 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65  on found in vdbe
23590 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  api.c..*/.static
235a0 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e   void vdbeFreeUn
235b0 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a  packed(sqlite3 *
235c0 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  db, UnpackedReco
235d0 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
235e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
235f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
23600 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
23610 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
23620 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
23630 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
23640 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
23650 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
23660 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
23670 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23680 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
23690 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
236a0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
236b0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
236c0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
236d0 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49  ATE_HOOK./*.** I
236e0 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70  nvoke the pre-up
236f0 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68  date hook. If th
23700 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  is is an UPDATE 
23710 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70  or DELETE pre-up
23720 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68  date call,.** th
23730 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  en cursor passed
23740 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
23750 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70  rgument should p
23760 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20  oint to the row 
23770 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75  about.** to be u
23780 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64  pdate or deleted
23790 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  . If the applica
237a0 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
237b0 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
237c0 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69  (),.** the requi
237d0 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  red value will b
237e0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
237f0 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70  row the cursor p
23800 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69  oints to..*/.voi
23810 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  d sqlite3VdbePre
23820 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64  UpdateHook(.  Vd
23830 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23850 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65   Vdbe pre-update
23860 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64   hook is invoked
23870 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72   by */.  VdbeCur
23880 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
23890 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
238a0 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a  or to grab old.*
238b0 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a   values from */.
238c0 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45    /* SQLITE_INSE
238f0 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
23900 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  LETE */.  const 
23910 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
23920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
23930 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
23940 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c  /* Modified tabl
23970 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31  e */.  i64 iKey1
23980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23990 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
239a0 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20  l key value */. 
239b0 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239d0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
239e0 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f   new.* record */
239f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23a00 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34  b = v->db;.  i64
23a10 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64   iKey2;.  PreUpd
23a20 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20  ate preupdate;. 
23a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
23a40 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  l = pTab->zName;
23a50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
23a60 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  u8 fakeSortOrder
23a70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
23a80 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d   db->pPreUpdate=
23a90 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
23aa0 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69  preupdate, 0, si
23ab0 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29  zeof(PreUpdate))
23ac0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ;.  if( op==SQLI
23ad0 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
23ae0 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
23af0 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65  [iReg].u.i;.  }e
23b00 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d  lse{.    iKey2 =
23b10 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61   iKey1;.  }..  a
23b20 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69  ssert( pCsr->nFi
23b30 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  eld==pTab->nCol 
23b40 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72  .       || (pCsr
23b50 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
23b60 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51  nCol+1 && op==SQ
23b70 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69  LITE_DELETE && i
23b80 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20  Reg==-1).  );.. 
23b90 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76   preupdate.v = v
23ba0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43  ;.  preupdate.pC
23bb0 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65  sr = pCsr;.  pre
23bc0 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a  update.op = op;.
23bd0 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77    preupdate.iNew
23be0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72  Reg = iReg;.  pr
23bf0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
23c00 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70  db = db;.  preup
23c10 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63  date.keyinfo.enc
23c20 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72   = ENC(db);.  pr
23c30 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
23c40 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  nField = pTab->n
23c50 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
23c60 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
23c70 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  der = (u8*)&fake
23c80 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
23c90 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
23ca0 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
23cb0 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
23cc0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
23cd0 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
23ce0 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
23cf0 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
23d00 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
23d10 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
23d20 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
23d30 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
23d40 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
23d50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
23d60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23d70 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
23d80 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
23d90 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
23da0 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64  update.pUnpacked
23db0 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
23dc0 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
23dd0 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64  ate.pNewUnpacked
23de0 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61  );.  if( preupda
23df0 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69  te.aNew ){.    i
23e00 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
23e10 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c  0; i<pCsr->nFiel
23e20 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
23e30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
23e40 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e  ease(&preupdate.
23e50 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aNew[i]);.    }.
23e60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23e70 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  e(db, preupdate.
23e80 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
23e90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
23ea0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
23eb0 4f 4f 4b 20 2a 2f 0a                             OOK */.