/ Hex Artifact Content
Login

Artifact 436a903111fcc184bae36f9016100da0d294da294d526bf4702328da1ddcde4b:


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 20 20 69 66 28 20 21 69 73 50 72  urn;.  if( !isPr
0640: 65 70 61 72 65 56 32 20 29 20 70 2d 3e 65 78 70  epareV2 ) p->exp
0650: 6d 61 73 6b 20 3d 20 30 3b 0a 23 69 66 20 64 65  mask = 0;.#if de
0660: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0670: 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
0680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0690: 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28  LE_SQLLOG).  if(
06a0: 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20   !isPrepareV2 ) 
06b0: 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20  return;.#endif. 
06c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c   assert( p->zSql
06d0: 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c  ==0 );.  p->zSql
06e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
06f0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29  Dup(p->db, z, n)
0700: 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65  ;.  p->isPrepare
0710: 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61  V2 = (u8)isPrepa
0720: 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  reV2;.}../*.** S
0730: 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  wap all content 
0740: 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45  between two VDBE
0750: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
0760: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0770: 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56  Swap(Vdbe *pA, V
0780: 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65  dbe *pB){.  Vdbe
0790: 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63   tmp, *pTmp;.  c
07a0: 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73  har *zTmp;.  ass
07b0: 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d  ert( pA->db==pB-
07c0: 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a  >db );.  tmp = *
07d0: 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b  pA;.  *pA = *pB;
07e0: 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20  .  *pB = tmp;.  
07f0: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74  pTmp = pA->pNext
0800: 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20  ;.  pA->pNext = 
0810: 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d  pB->pNext;.  pB-
0820: 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20  >pNext = pTmp;. 
0830: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65   pTmp = pA->pPre
0840: 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d  v;.  pA->pPrev =
0850: 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42   pB->pPrev;.  pB
0860: 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a  ->pPrev = pTmp;.
0870: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71    zTmp = pA->zSq
0880: 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20  l;.  pA->zSql = 
0890: 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->zSql;.  pB->
08a0: 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 70  zSql = zTmp;.  p
08b0: 42 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d  B->isPrepareV2 =
08c0: 20 70 41 2d 3e 69 73 50 72 65 70 61 72 65 56 32   pA->isPrepareV2
08d0: 3b 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20  ;.  pB->expmask 
08e0: 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 7d  = pA->expmask;.}
08f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
0900: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
0910: 79 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  y so that it is 
0920: 61 74 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65  at least nOp ele
0930: 6d 65 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a  ments larger .**
0940: 20 74 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e   than its curren
0950: 74 20 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67  t size. nOp is g
0960: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
0970: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
0980: 61 6c 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69  al.** to 1024/si
0990: 7a 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20  zeof(Op)..**.** 
09a0: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
09b0: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
09c0: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
09d0: 74 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72  the array, retur
09e0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  n.** SQLITE_NOME
09f0: 4d 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  M. In this case 
0a00: 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72  Vdbe.aOp and Par
0a10: 73 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61  se.nOpAlloc rema
0a20: 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  in .** unchanged
0a30: 20 28 74 68 69 73 20 69 73 20 73 6f 20 74 68 61   (this is so tha
0a40: 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  t any opcodes al
0a50: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
0a60: 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65  can be .** corre
0a70: 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64  ctly deallocated
0a80: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
0a90: 72 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65  rest of the Vdbe
0aa0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
0ab0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62   growOpArray(Vdb
0ac0: 65 20 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a  e *v, int nOp){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
0af0: 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68  pParse;..  /* Th
0b00: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  e SQLITE_TEST_RE
0b10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d  ALLOC_STRESS com
0b20: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
0b30: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
0b40: 66 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20  force.  ** more 
0b50: 66 72 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63  frequent realloc
0b60: 73 20 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76  s and hence prov
0b70: 69 64 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ide more opportu
0b80: 6e 69 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a  nities for .  **
0b90: 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66   simulated OOM f
0ba0: 61 75 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54  aults.  SQLITE_T
0bb0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
0bc0: 53 53 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20  SS is generally 
0bd0: 75 73 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67  used.  ** during
0be0: 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20   testing only.  
0bf0: 57 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  With SQLITE_TEST
0c00: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0c10: 67 72 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61  grow the op arra
0c20: 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69  y.  ** by the mi
0c30: 6e 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65  nimum* amount re
0c40: 71 75 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65  quired until the
0c50: 20 73 69 7a 65 20 72 65 61 63 68 65 73 20 35 31   size reaches 51
0c60: 32 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  2.  Normal.  ** 
0c70: 6f 70 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f  operation (witho
0c80: 75 74 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ut SQLITE_TEST_R
0c90: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69  EALLOC_STRESS) i
0ca0: 73 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20  s to double the 
0cb0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a  current.  ** siz
0cc0: 65 20 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61  e of the op arra
0cd0: 79 20 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20  y or add 1KB of 
0ce0: 73 70 61 63 65 2c 20 77 68 69 63 68 65 76 65 72  space, whichever
0cf0: 20 69 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a   is smaller. */.
0d00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0d10: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
0d20: 53 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28  S.  int nNew = (
0d30: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32  p->nOpAlloc>=512
0d40: 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   ? p->nOpAlloc*2
0d50: 20 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e   : p->nOpAlloc+n
0d60: 4f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  Op);.#else.  int
0d70: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d80: 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c  lloc ? p->nOpAll
0d90: 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32  oc*2 : (int)(102
0da0: 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a  4/sizeof(Op)));.
0db0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
0dc0: 45 52 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a  ER(nOp);.#endif.
0dd0: 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61  .  /* Ensure tha
0de0: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  t the size of a 
0df0: 56 44 42 45 20 64 6f 65 73 20 6e 6f 74 20 67 72  VDBE does not gr
0e00: 6f 77 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ow too large */.
0e10: 20 20 69 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e    if( nNew > p->
0e20: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
0e30: 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
0e40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
0e50: 6f 6d 46 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a  omFault(p->db);.
0e60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0e70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
0e80: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0e90: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0eb0: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0ec0: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0ed0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0ee0: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0ef0: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0f00: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0f10: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63      p->szOpAlloc
0f20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0f30: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e  ocSize(p->db, pN
0f40: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  ew);.    p->nOpA
0f50: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c  lloc = p->szOpAl
0f60: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a  loc/sizeof(Op);.
0f70: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65      v->aOp = pNe
0f80: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
0f90: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f  (pNew ? SQLITE_O
0fa0: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
0fb0: 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65  _BKPT);.}..#ifde
0fc0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0fd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0fe0: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
0ff0: 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
1000: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 68   a breakpoint th
1010: 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20  at will.** fire 
1020: 61 66 74 65 72 20 65 61 63 68 20 6f 70 63 6f 64  after each opcod
1030: 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e  e is inserted an
1040: 64 20 64 69 73 70 6c 61 79 65 64 20 75 73 69 6e  d displayed usin
1050: 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76 64 62  g.** "PRAGMA vdb
1060: 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22  e_addoptrace=on"
1070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1080: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
1090: 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
10a0: 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20 30  static int n = 0
10b0: 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69  ;.  n++;.}.#endi
10c0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  f../*.** Add a n
10d0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
10e0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
10f0: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
1100: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
1110: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
1120: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1130: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
1140: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
1150: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
1160: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
1170: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
1180: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
1190: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
11a0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
11b0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
11c0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
11d0: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
11e0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
11f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
1200: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
1210: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
1220: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
1230: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
1240: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
1250: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1260: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
1270: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
1280: 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72  _NOINLINE int gr
1290: 6f 77 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  owOp3(Vdbe *p, i
12a0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
12b0: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
12c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
12d0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  rse->nOpAlloc<=p
12e0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
12f0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
1300: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
1310: 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65  ssert( p->pParse
1320: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f  ->nOpAlloc>p->nO
1330: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  p );.  return sq
1340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1350: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1360: 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  3);.}.int sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65  3VdbeAddOp3(Vdbe
1380: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1390: 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74   p1, int p2, int
13a0: 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   p3){.  int i;. 
13b0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20   VdbeOp *pOp;.. 
13c0: 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61   i = p->nOp;.  a
13d0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
13e0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
13f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
1400: 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29  >=0 && op<0xff )
1410: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 72 73  ;.  if( p->pPars
1420: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  e->nOpAlloc<=i )
1430: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
1440: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1450: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1460: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1470: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1480: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1490: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
14a0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
14b0: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
14c0: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
14d0: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
14e0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
14f0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
1500: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1510: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
1520: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
1530: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
1540: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1550: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1560: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1570: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1580: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c  e ){.    int jj,
1590: 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a   kk;.    Parse *
15a0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
15b0: 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b  se;.    for(jj=k
15c0: 6b 3d 30 3b 20 6a 6a 3c 70 50 61 72 73 65 2d 3e  k=0; jj<pParse->
15d0: 6e 43 6f 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b 29  nColCache; jj++)
15e0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 79  {.      struct y
15f0: 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50  ColCache *x = pP
1600: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20  arse->aColCache 
1610: 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 70 72 69 6e  + jj;.      prin
1620: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
1630: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
1640: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
1650: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1670: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
1680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1690: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
16a0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
16b0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
16c0: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
16d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
16e0: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
16f0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
1700: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
1710: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1720: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1730: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d   pOp->iSrcLine =
1740: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
1750: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
1760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
1770: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
1780: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1790: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
17a0: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
17b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
17c0: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
17d0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
17e0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17f0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1800: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
1810: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1820: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
1830: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1840: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
1850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1860: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1870: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  0);.}../* Genera
1880: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 75  te code for an u
1890: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d  nconditional jum
18a0: 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  p to instruction
18b0: 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71   iDest.*/.int sq
18c0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 56 64  lite3VdbeGoto(Vd
18d0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74  be *p, int iDest
18e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
18f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1900: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65   OP_Goto, 0, iDe
1910: 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65  st, 0);.}../* Ge
1920: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
1930: 61 75 73 65 20 74 68 65 20 73 74 72 69 6e 67 20  ause the string 
1940: 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61 64 65  zStr to be loade
1950: 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74  d into.** regist
1960: 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  er iDest.*/.int 
1970: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1980: 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c 20 69  tring(Vdbe *p, i
1990: 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20  nt iDest, const 
19a0: 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72  char *zStr){.  r
19b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
19c0: 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74  eAddOp4(p, OP_St
19d0: 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2c  ring8, 0, iDest,
19e0: 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a   0, zStr, 0);.}.
19f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a00: 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
1a10: 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20 72  lizes multiple r
1a20: 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 72 69  egisters to stri
1a30: 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a  ng or integer.**
1a40: 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
1a50: 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1a60: 20 77 69 74 68 20 69 44 65 73 74 20 61 6e 64 20   with iDest and 
1a70: 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65 63 75  increase consecu
1a80: 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72  tively..** One r
1a90: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
1aa0: 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63 68 20  alized for each 
1ab0: 63 68 61 72 61 63 67 74 65 72 20 69 6e 20 7a 54  characgter in zT
1ac0: 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63  ypes[].  For eac
1ad0: 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61 63 74  h.** "s" charact
1ae0: 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20  er in zTypes[], 
1af0: 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
1b00: 61 20 73 74 72 69 6e 67 20 69 66 20 74 68 65 20  a string if the 
1b10: 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e  argument is.** n
1b20: 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e  ot NULL, or OP_N
1b30: 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c 75 65  ull if the value
1b40: 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   is a null point
1b50: 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20 22 69  er.  For each "i
1b60: 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  " character.** i
1b70: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20  n zTypes[], the 
1b80: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
1b90: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e  ialized to an in
1ba0: 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  teger..*/.void s
1bb0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
1bc0: 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oad(Vdbe *p, int
1bd0: 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   iDest, const ch
1be0: 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29  ar *zTypes, ...)
1bf0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
1c00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
1c10: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
1c20: 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72  , zTypes);.  for
1c30: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65  (i=0; (c = zType
1c40: 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  s[i])!=0; i++){.
1c50: 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29      if( c=='s' )
1c60: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1c70: 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61  ar *z = va_arg(a
1c80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
1c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ca0: 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30  beAddOp4(p, z==0
1cb0: 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f   ? OP_Null : OP_
1cc0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1cd0: 74 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20  t++, 0, z, 0);. 
1ce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf0: 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29  assert( c=='i' )
1d00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d10: 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f  dbeAddOp2(p, OP_
1d20: 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28  Integer, va_arg(
1d30: 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b  ap, int), iDest+
1d40: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +);.    }.  }.  
1d50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
1d60: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1d70: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1d80: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1d90: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1da0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1db0: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1dd0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1de0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1df0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1e00: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1e10: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e30: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1e40: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1e50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1e60: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1e70: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1e80: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1e90: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1ea0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1eb0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1ec0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1ee0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1ef0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
1f00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1f10: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1f20: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1f30: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1f40: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1f50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1f70: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1f80: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1f90: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
1fa0: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
1fb0: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
1fc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1fd0: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1ff0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
2000: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
2010: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2020: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2030: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2050: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2060: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2070: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2080: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2090: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
20a0: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
20b0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
20c0: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
20d0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
20e0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
20f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
2100: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
2110: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
2120: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2130: 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56 64  cRawNN(sqlite3Vd
2140: 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69  beDb(p), 8);.  i
2150: 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63  f( p4copy ) memc
2160: 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20  py(p4copy, zP4, 
2170: 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  8);.  return sql
2180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
2190: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
21a0: 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65  , p4copy, p4type
21b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
21c0: 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  an OP_ParseSchem
21d0: 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  a opcode.  This 
21e0: 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65  routine is broke
21f0: 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71  n out from.** sq
2200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2210: 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73  ) since it needs
2220: 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74   to also needs t
2230: 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65  o mark all btree
2240: 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62  s.** as having b
2250: 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  een used..**.** 
2260: 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e  The zWhere strin
2270: 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
2280: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2290: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
22a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22b0: 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72   will take owner
22c0: 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ship of the allo
22d0: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  cated memory..*/
22e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
22f0: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
2300: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  p(Vdbe *p, int i
2310: 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65  Db, char *zWhere
2320: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71  ){.  int j;.  sq
2330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2340: 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  p, OP_ParseSchem
2350: 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57  a, iDb, 0, 0, zW
2360: 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  here, P4_DYNAMIC
2370: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
2380: 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29  p->db->nDb; j++)
2390: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
23a0: 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a  Btree(p, j);.}..
23b0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
23c0: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
23d0: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
23e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  s an integer..*/
23f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2400: 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62  AddOp4Int(.  Vdb
2410: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
2420: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
2430: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
2440: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2460: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
2470: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2480: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
2490: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b0: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
24c0: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
24e0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  3 operand */.  i
24f0: 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20  nt p4           
2500: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
2510: 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67  rand as an integ
2520: 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
2530: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2540: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
2550: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69 66  1, p2, p3);.  if
2560: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
2570: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
2580: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70  VdbeOp *pOp = &p
2590: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20  ->aOp[addr];.   
25a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
25b0: 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f 70  4_INT32;.    pOp
25c0: 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20 7d  ->p4.i = p4;.  }
25d0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
25e0: 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  }../* Insert the
25f0: 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75   end of a co-rou
2600: 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tine.*/.void sql
2610: 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
2620: 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  tine(Vdbe *v, in
2630: 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20 73  t regYield){.  s
2640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2650: 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
2660: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
2670: 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
2680: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2690: 65 72 20 63 61 63 68 65 2c 20 74 68 65 72 65 62  er cache, thereb
26a0: 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  y ensuring that 
26b0: 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75  each.  ** co-rou
26c0: 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77 6e  tine has its own
26d0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 74   independent set
26e0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20 62   of registers, b
26f0: 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e  ecause co-routin
2700: 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65 78  es.  ** might ex
2710: 70 65 63 74 20 74 68 65 69 72 20 72 65 67 69 73  pect their regis
2720: 74 65 72 73 20 74 6f 20 62 65 20 70 72 65 73 65  ters to be prese
2730: 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20 4f  rved across an O
2740: 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a  P_Yield, and.  *
2750: 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61 75  * that could cau
2760: 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20 74  se problems if t
2770: 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f  wo or more co-ro
2780: 75 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e 67  utines are using
2790: 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74   the same.  ** t
27a0: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
27b0: 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61  r..  */.  v->pPa
27c0: 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
27d0: 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e  0;.  v->pParse->
27e0: 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
27f0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2800: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
2810: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
2820: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
2830: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
2840: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
2850: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
2860: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
2870: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
2880: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
2890: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
28a0: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
28b0: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
28c0: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
28d0: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
28e0: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
28f0: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
2900: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
2910: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
2920: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
2930: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
2940: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
2950: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
2960: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
2970: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
2980: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
2990: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
29a0: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
29b0: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
29c0: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
29d0: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
29e0: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
29f0: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
2a00: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
2a10: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
2a20: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
2a30: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  be resolved..**.
2a40: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
2a50: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ned if a malloc(
2a60: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  ) fails..*/.int 
2a70: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2a80: 61 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20  abel(Vdbe *v){. 
2a90: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
2aa0: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d  Parse;.  int i =
2ab0: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
2ac0: 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63  assert( v->magic
2ad0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2ae0: 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20  T );.  if( (i & 
2af0: 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (i-1))==0 ){.   
2b00: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
2b10: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2b20: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
2b30: 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  abel, .         
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
2b60: 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  *2+1)*sizeof(p->
2b70: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d  aLabel[0]));.  }
2b80: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
2b90: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2ba0: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
2bb0: 20 72 65 74 75 72 6e 20 41 44 44 52 28 69 29 3b   return ADDR(i);
2bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2bd0: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2be0: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2bf0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2c00: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2c10: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2c20: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2c30: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2c40: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2c50: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
2c60: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2c70: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2c80: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2c90: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
2ca0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
2cb0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2cc0: 6e 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a  nt j = ADDR(x);.
2cd0: 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67    assert( v->mag
2ce0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2cf0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
2d00: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
2d10: 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 29    assert( j>=0 )
2d20: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
2d30: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
2d40: 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a  el[j] = v->nOp;.
2d50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2d60: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
2d70: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
2d80: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
2d90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2da0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2db0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
2dc0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
2dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68  }../*.** Mark th
2de0: 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68  e VDBE as one th
2df0: 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72  at can only be r
2e00: 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  un multiple time
2e10: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2e20: 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 56  e3VdbeReusable(V
2e30: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
2e40: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d  nOnlyOnce = 0;.}
2e50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e60: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
2e70: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
2e80: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
2e90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2ea0: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
2eb0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
2ec0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
2ed0: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
2ee0: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
2ef0: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
2f00: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
2f10: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
2f20: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
2f30: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
2f40: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
2f50: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
2f60: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
2f70: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
2f80: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
2f90: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
2fa0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2fb0: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
2fc0: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
2ff0: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
3000: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
3010: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
3020: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
3030: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
3040: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
3050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
3060: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
3070: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
3080: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
3090: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
30a0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
30b0: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
30e0: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
30f0: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
3100: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
3110: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
3120: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
3130: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
3160: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
3170: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
31a0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
31b0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
31c0: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
31d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
31e0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
31f0: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
3200: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
3210: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
3220: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
3230: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
3240: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
3250: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
3260: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
3270: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
3280: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
3290: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
32a0: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
32b0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
32c0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
32d0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
32e0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
32f0: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
3300: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
3310: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
3320: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
3330: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
3340: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
3350: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
3360: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
3370: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
3380: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
3390: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
33a0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
33b0: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
33c0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
33d0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
33e0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
33f0: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
3400: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
3410: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
3420: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
3430: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
3440: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
3450: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
3460: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
3470: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3480: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
3490: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
34a0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
34b0: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
34c0: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
34d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
34e0: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
34f0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
3500: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3510: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
3520: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
3530: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
3540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3550: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
3560: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3570: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
3580: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
3590: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
35a0: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
35b0: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
35c0: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
35d0: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
35e0: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
35f0: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
3600: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
3610: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
3620: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
3630: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
3640: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
3650: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
3660: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
3670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
3680: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
3690: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
36a0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
36b0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
36c0: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
36d0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
36e0: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
36f0: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
3700: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
3710: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
3720: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
3730: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
3740: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
3750: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
3760: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
3770: 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20  traint).**   *  
3780: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 61  OP_CreateTable a
3790: 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  nd OP_InitCorout
37a0: 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 45 20  ine (for CREATE 
37b0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
37c0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
37d0: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
37e0: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
37f0: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
3800: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
3810: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
3820: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3830: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3840: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
3850: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3860: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
3870: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
3880: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
3890: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
38a0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
38b0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
38c0: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
38d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
38e0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
38f0: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
3900: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
3910: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
3920: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
3930: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
3940: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
3950: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
3960: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
3970: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
3980: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
3990: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
39a0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20  InitCoroutine = 
39b0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
39c0: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
39d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  ;.  memset(&sIte
39e0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
39f0: 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20  er));.  sIter.v 
3a00: 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  = v;..  while( (
3a10: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3a20: 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a  (&sIter))!=0 ){.
3a30: 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d      int opcode =
3a40: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
3a50: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3a60: 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f  _Destroy || opco
3a70: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
3a80: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
3a90: 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28 28  name .     || ((
3aa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
3ab0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
3ac0: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
3ad0: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
3ae0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
3af0: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
3b00: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
3b10: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
3b20: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
3b30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3b40: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  if( opcode==OP_C
3b50: 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 61 73  reateTable ) has
3b60: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31 3b  CreateTable = 1;
3b70: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3b80: 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e  =OP_InitCoroutin
3b90: 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f 75  e ) hasInitCorou
3ba0: 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65  tine = 1;.#ifnde
3bb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3bc0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66  REIGN_KEY.    if
3bd0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43  ( opcode==OP_FkC
3be0: 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70  ounter && pOp->p
3bf0: 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d  1==0 && pOp->p2=
3c00: 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73 46  =1 ){.      hasF
3c10: 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20  kCounter = 1;.  
3c20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
3c30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
3c40: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
3c50: 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  b);..  /* Return
3c60: 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72   true if hasAbor
3c70: 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20  t==mayAbort. Or 
3c80: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
3c90: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
3ca0: 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ** If malloc fai
3cb0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68  led, then the wh
3cc0: 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65  ile() loop above
3cd0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74   may not have it
3ce0: 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f  erated.  ** thro
3cf0: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ugh all opcodes 
3d00: 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79  and hasAbort may
3d10: 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63   be set incorrec
3d20: 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a  tly. Return.  **
3d30: 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63   true for this c
3d40: 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ase to prevent t
3d50: 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74  he assert() in t
3d60: 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65  he callers frame
3d70: 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69  .  ** from faili
3d80: 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ng.  */.  return
3d90: 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63   ( v->db->malloc
3da0: 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f  Failed || hasAbo
3db0: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20  rt==mayAbort || 
3dc0: 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20  hasFkCounter.   
3dd0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 68             || (h
3de0: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26 26  asCreateTable &&
3df0: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
3e00: 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e) );.}.#endif /
3e10: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
3e20: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
3e30: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
3e40: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
3e50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3e60: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
3e70: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
3e80: 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49 74  en inserted.  It
3e90: 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75 67   loops.** throug
3ea0: 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65  h all the opcode
3eb0: 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20 73  s and fixes up s
3ec0: 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  ome details..**.
3ed0: 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68 20  ** (1) For each 
3ee0: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
3ef0: 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76 65   with a negative
3f00: 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61 62   P2 value (a lab
3f10: 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f 6c  el).**     resol
3f20: 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ve the P2 value 
3f30: 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64 64  to an actual add
3f40: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20  ress..**.** (2) 
3f50: 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78 69  Compute the maxi
3f60: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
3f70: 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79 20  guments used by 
3f80: 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  any SQL function
3f90: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f 72  .**     and stor
3fa0: 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 20  e that value in 
3fb0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a 2a  *pMaxFuncArgs..*
3fc0: 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65 20  *.** (3) Update 
3fd0: 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e 6c  the Vdbe.readOnl
3fe0: 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52 65  y and Vdbe.bIsRe
3ff0: 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61 63  ader flags to ac
4000: 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  curately.**     
4010: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
4020: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
4030: 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64 6f  ment actually do
4040: 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e  es..**.** (4) In
4050: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34 2e  itialize the p4.
4060: 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72  xAdvance pointer
4070: 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61 74   on opcodes that
4080: 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28   use it..**.** (
4090: 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  5) Reclaim the m
40a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
40b0: 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62 65  for storing labe
40c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ls..**.** This r
40d0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
40e0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63   function correc
40f0: 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70 63  tly if the mkopc
4100: 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74  odeh.tcl generat
4110: 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75 6d  or.** script num
4120: 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65 73  bers the opcodes
4130: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68 61   correctly.  Cha
4140: 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f 75  nges to this rou
4150: 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20  tine must be.** 
4160: 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74 68  coordinated with
4170: 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f 70   changes to mkop
4180: 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74  codeh.tcl..*/.st
4190: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
41a0: 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a  eP2Values(Vdbe *
41b0: 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63  p, int *pMaxFunc
41c0: 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d 61  Args){.  int nMa
41d0: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
41e0: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
41f0: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
4200: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
4210: 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70   int *aLabel = p
4220: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20  Parse->aLabel;. 
4230: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31   p->readOnly = 1
4240: 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72  ;.  p->bIsReader
4250: 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26 70   = 0;.  pOp = &p
4260: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
4270: 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20 20  .  while(1){..  
4280: 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f    /* Only JUMP o
4290: 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20 73  pcodes and the s
42a0: 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70 65  hort list of spe
42b0: 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e 20  cial opcodes in 
42c0: 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20 2a  the switch.    *
42d0: 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f 20  * below need to 
42e0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 20  be considered.  
42f0: 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63  The mkopcodeh.tc
4300: 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72 69  l generator scri
4310: 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a 2a  pt groups.    **
4320: 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f 64   all these opcod
4330: 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61 72  es together near
4340: 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74 68   the front of th
4350: 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20 20  e opcode list.  
4360: 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79 20  Skip.    ** any 
4370: 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65 73  opcode that does
4380: 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65 73   not need proces
4390: 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c 20  sing by virtual 
43a0: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
43b0: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  .    ** it is la
43c0: 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  rger than SQLITE
43d0: 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c  _MX_JUMP_OPCODE,
43e0: 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
43f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
4400: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
4410: 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c 49  Op->opcode<=SQLI
4420: 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44  TE_MX_JUMP_OPCOD
4430: 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f  E ){.      /* NO
4440: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
4450: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
4460: 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67 20  tcl when adding 
4470: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
4480: 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20    ** cases from 
4490: 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a  this switch! */.
44a0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 4f        switch( pO
44b0: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
44c0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
44d0: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
44e0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
44f0: 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e  2!=0 ) p->readOn
4500: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
4510: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
4520: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
4530: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
4540: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20 20  Commit:.        
4550: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
4560: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t: {.          p
4570: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
4580: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e  ;.        }.#ifn
45a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
45b0: 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73 65  WAL.        case
45c0: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a   OP_Checkpoint:.
45d0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63  #endif.        c
45e0: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
45f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a         case OP_J
4600: 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20  ournalMode: {.  
4610: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
4620: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4630: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
4640: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
4650: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4660: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4670: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4680: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4690: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
46a0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
46b0: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
46c0: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
46d0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
46e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
46f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
4700: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ter: {.         
4710: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
4720: 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d    assert( (pOp -
4730: 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b   p->aOp) >= 3 );
4740: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
4750: 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
4760: 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b  e==OP_Integer );
4770: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70  .          n = p
4780: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
4790: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
47a0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
47b0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   n;.          br
47c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
47d0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63 61  endif.        ca
47e0: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
47f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4800: 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 20 20  IfOpen:.        
4810: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
4820: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xt: {.          
4830: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
4840: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
4850: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
4860: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
4870: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
4880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4890: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
48a0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
48b0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
48c0: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
48d0: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
48e0: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
48f0: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20  ePrevious;.     
4900: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
4910: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
4920: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4940: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 71 6c  }.      if( (sql
4950: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
4960: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20  ty[pOp->opcode] 
4970: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30  & OPFLG_JUMP)!=0
4980: 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b   && pOp->p2<0 ){
4990: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
49a0: 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70   ADDR(pOp->p2)<p
49b0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
49c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
49d0: 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70   = aLabel[ADDR(p
49e0: 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20  Op->p2)];.      
49f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4a00: 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72  pOp==p->aOp ) br
4a10: 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a  eak;.    pOp--;.
4a20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
4a30: 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73  ree(p->db, pPars
4a40: 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50  e->aLabel);.  pP
4a50: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  arse->aLabel = 0
4a60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62  ;.  pParse->nLab
4a70: 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46  el = 0;.  *pMaxF
4a80: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
4a90: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  gs;.  assert( p-
4aa0: 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c  >bIsReader!=0 ||
4ab0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
4ac0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
4ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4ae0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
4af0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
4b00: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
4b10: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
4b20: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4b30: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
4b40: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
4b50: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4b60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
4b70: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  Op;.}../*.** Ver
4b80: 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61 73  ify that at leas
4b90: 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73  t N opcode slots
4ba0: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69   are available i
4bb0: 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  n p without.** h
4bc0: 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20  aving to malloc 
4bd0: 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20 28  for more space (
4be0: 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d 70  except when comp
4bf0: 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51  iled using.** SQ
4c00: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
4c10: 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69 73  C_STRESS).  This
4c20: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 73   interface is us
4c30: 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
4c40: 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20 74  g.** to verify t
4c50: 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c 6c  hat certain call
4c60: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
4c70: 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e 20  AddOpList() can 
4c80: 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75  never.** fail du
4c90: 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74  e to a OOM fault
4ca0: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20   and hence that 
4cb0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
4cc0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
4ce0: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 6e  will always be n
4cf0: 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20  on-NULL..*/.#if 
4d00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
4d10: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
4d20: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
4d30: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
4d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
4d50: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
4d60: 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  ired(Vdbe *p, in
4d70: 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
4d80: 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d  p->nOp + N <= p-
4d90: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
4da0: 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  c );.}.#endif../
4db0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
4dc0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
4dd0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
4de0: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ent does not con
4df0: 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65  tain.** an OP_Re
4e00: 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20  sultRow opcode. 
4e10: 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28 29  Fail an assert()
4e20: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68 69   if it does. Thi
4e30: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79 20  s is used.** by 
4e40: 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e 63  code in pragma.c
4e50: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
4e60: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
4e70: 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a  on of certain.**
4e80: 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74   pragmas comport
4e90: 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 73  s with the flags
4ea0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
4eb0: 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74 63  e mkpragmatab.tc
4ec0: 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a  l.** script..*/.
4ed0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4ee0: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
4ef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
4f00: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
4f10: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
4f20: 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
4f30: 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Row(Vdbe *p){.  
4f40: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4f50: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
4f60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
4f70: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
4f80: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a  OP_ResultRow );.
4f90: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
4fa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4fb0: 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
4fc0: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
4fd0: 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f   of opcodes asso
4fe0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
4ff0: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
5000: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5010: 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20  ment. It is the 
5020: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
5030: 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72  bility.** to arr
5040: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74  ange for the ret
5050: 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62  urned array to b
5060: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
5070: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ed using the .**
5080: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
5090: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
50a0: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
50b0: 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65  ing, *pnOp is se
50c0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
50d0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
50e0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72  e returned.** ar
50f0: 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61  ray. Also, *pnMa
5100: 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74  xArg is set to t
5110: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73  he larger of its
5120: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
5130: 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  nd .** the numbe
5140: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
5150: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
5160: 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20   array required 
5170: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a  to execute the .
5180: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67  ** returned prog
5190: 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ram..*/.VdbeOp *
51a0: 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f  sqlite3VdbeTakeO
51b0: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20  pArray(Vdbe *p, 
51c0: 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a  int *pnOp, int *
51d0: 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62  pnMaxArg){.  Vdb
51e0: 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f  eOp *aOp = p->aO
51f0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70  p;.  assert( aOp
5200: 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   && !p->db->mall
5210: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
5220: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c  * Check that sql
5230: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
5240: 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  e() was not call
5250: 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f  ed on this VM */
5260: 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
5270: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
5280: 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73  eMask) );..  res
5290: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
52a0: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
52b0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
52c0: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
52d0: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
52e0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
52f0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
5300: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
5310: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
5320: 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
5330: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
5340: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
5350: 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32  *.** Non-zero P2
5360: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75   arguments to ju
5370: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
5380: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
5390: 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f  y adjusted.** so
53a0: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74   that the jump t
53b0: 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69 76  arget is relativ
53c0: 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f  e to the first o
53d0: 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65  peration inserte
53e0: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
53f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
5400: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  st(.  Vdbe *p,  
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65     /* Add opcode
5430: 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  s to the prepare
5440: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
5450: 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20   int nOp,       
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5470: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64   Number of opcod
5480: 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56  es to add */.  V
5490: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
54a0: 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  *aOp,       /* T
54b0: 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  he opcodes to be
54c0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
54d0: 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20  iLineno         
54e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
54f0: 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d  ce-file line num
5500: 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63  ber of first opc
5510: 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ode */.){.  int 
5520: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75  i;.  VdbeOp *pOu
5530: 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73  t, *pFirst;.  as
5540: 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20  sert( nOp>0 );. 
5550: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5560: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5570: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
5580: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50  Op + nOp > p->pP
5590: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26  arse->nOpAlloc &
55a0: 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  & growOpArray(p,
55b0: 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74   nOp) ){.    ret
55c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69  urn 0;.  }.  pFi
55d0: 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d  rst = pOut = &p-
55e0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20  >aOp[p->nOp];.  
55f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
5600: 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74  i++, aOp++, pOut
5610: 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f  ++){.    pOut->o
5620: 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63  pcode = aOp->opc
5630: 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  ode;.    pOut->p
5640: 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20  1 = aOp->p1;.   
5650: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d   pOut->p2 = aOp-
5660: 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >p2;.    assert(
5670: 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   aOp->p2>=0 );. 
5680: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f     if( (sqlite3O
5690: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f  pcodeProperty[aO
56a0: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
56b0: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61  LG_JUMP)!=0 && a
56c0: 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20  Op->p2>0 ){.    
56d0: 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d    pOut->p2 += p-
56e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
56f0: 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e  pOut->p3 = aOp->
5700: 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  p3;.    pOut->p4
5710: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
5720: 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  D;.    pOut->p4.
5730: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d  p = 0;.    pOut-
5740: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
5750: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
5760: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
5770: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
5780: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
5790: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
57a0: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f  _COVERAGE.    pO
57b0: 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69  ut->iSrcLine = i
57c0: 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a  Lineno+i;.#else.
57d0: 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e      (void)iLinen
57e0: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  o;.#endif.#ifdef
57f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
5800: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
5810: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
5820: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
5830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
5840: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e  rintOp(0, i+p->n
5850: 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d  Op, &p->aOp[i+p-
5860: 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  >nOp]);.    }.#e
5870: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f  ndif.  }.  p->nO
5880: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75  p += nOp;.  retu
5890: 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69  rn pFirst;.}..#i
58a0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
58b0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
58c0: 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41  NSTATUS)./*.** A
58d0: 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
58e0: 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e  he array of coun
58f0: 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20  ters managed by 
5900: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
5910: 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f  nstatus()..*/.vo
5920: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63  id sqlite3VdbeSc
5930: 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65  anStatus(.  Vdbe
5940: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
5960: 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61  M to add scansta
5970: 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e  tus() to */.  in
5980: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20  t addrExplain,  
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
59a0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
59b0: 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
59c0: 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c  .  int addrLoop,
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
59f0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
5a00: 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69   .  int addrVisi
5a10: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5a20: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5a30: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63  f rows visited c
5a40: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45  ounter */.  LogE
5a50: 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20  st nEst,        
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5a70: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
5a80: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
5a90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5aa0: 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  zName           
5ab0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5ac0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65  able or index be
5ad0: 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29  ing scanned */.)
5ae0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
5af0: 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73  (p->nScan+1) * s
5b00: 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73  izeof(ScanStatus
5b10: 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20  );.  ScanStatus 
5b20: 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20  *aNew;.  aNew = 
5b30: 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c  (ScanStatus*)sql
5b40: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
5b50: 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e  >db, p->aScan, n
5b60: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65  Byte);.  if( aNe
5b70: 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61  w ){.    ScanSta
5b80: 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65  tus *pNew = &aNe
5b90: 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20  w[p->nScan++];. 
5ba0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70     pNew->addrExp
5bb0: 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61  lain = addrExpla
5bc0: 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  in;.    pNew->ad
5bd0: 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f  drLoop = addrLoo
5be0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  p;.    pNew->add
5bf0: 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69 73  rVisit = addrVis
5c00: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45  it;.    pNew->nE
5c10: 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  st = nEst;.    p
5c20: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  New->zName = sql
5c30: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e  ite3DbStrDup(p->
5c40: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
5c50: 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b  p->aScan = aNew;
5c60: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
5c70: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5c80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70   value of the op
5c90: 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c  code, or P1, P2,
5ca0: 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61   P3, or P5 opera
5cb0: 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65  nds.** for a spe
5cc0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
5cd0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5ce0: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
5cf0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  de(Vdbe *p, u32 
5d00: 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63  addr, u8 iNewOpc
5d10: 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ode){.  sqlite3V
5d20: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
5d30: 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f  ->opcode = iNewO
5d40: 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71  pcode;.}.void sq
5d50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5d60: 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  1(Vdbe *p, u32 a
5d70: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
5d80: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
5d90: 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20  p(p,addr)->p1 = 
5da0: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
5db0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
5dc0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5dd0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
5de0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5df0: 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61  p,addr)->p2 = va
5e00: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
5e10: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
5e20: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
5e30: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
5e40: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
5e50: 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b  addr)->p3 = val;
5e60: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5e70: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
5e80: 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20   *p, u16 p5){.  
5e90: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5ea0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
5eb0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
5ec0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61   p->nOp>0 ) p->a
5ed0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
5ee0: 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = p5;.}../*.** C
5ef0: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
5f00: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
5f10: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
5f20: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
5f30: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
5f40: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
5f50: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
5f60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5f70: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
5f80: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
5f90: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
5fa0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
5fb0: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
5fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
5fd0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
5fe0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
5ff0: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
6000: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
6010: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
6020: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
6030: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
6040: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
6050: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
6060: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
6070: 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65  Def){.  if( (pDe
6080: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
6090: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
60a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
60b0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
60c0: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pDef);.  }.}..st
60d0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
60e0: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
60f0: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
6100: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
6110: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
6120: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
6130: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
6140: 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d  E void freeP4Mem
6150: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65  (sqlite3 *db, Me
6160: 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  m *p){.  if( p->
6170: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
6180: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
6190: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69  zMalloc);.  sqli
61a0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
61b0: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c  p);.}.static SQL
61c0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
61d0: 64 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28  d freeP4FuncCtx(
61e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c  sqlite3 *db, sql
61f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29  ite3_context *p)
6200: 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72 61  {.  freeEphemera
6210: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d  lFunction(db, p-
6220: 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65  >pFunc);. sqlite
6230: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
6240: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
6250: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a  freeP4(sqlite3 *
6260: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20  db, int p4type, 
6270: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73  void *p4){.  ass
6280: 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69  ert( db );.  swi
6290: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
62a0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43     case P4_FUNCC
62b0: 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65  TX: {.      free
62c0: 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73  P4FuncCtx(db, (s
62d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
62e0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
62f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6300: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61   P4_REAL:.    ca
6310: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
6320: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
6330: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  :.    case P4_IN
6340: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
6350: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6360: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , p4);.      bre
6370: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6380: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6390: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70  .      if( db->p
63a0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
63b0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
63c0: 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70  nref((KeyInfo*)p
63d0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
63e0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
63f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
6400: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
6410: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
6420: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6430: 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29  lete(db, (Expr*)
6440: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
6450: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6460: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
6470: 45 46 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65  EF: {.      free
6480: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
6490: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
64a0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
64b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
64c0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
64d0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
64e0: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
64f0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
6500: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
6510: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
6520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
6530: 72 65 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65  reeP4Mem(db, (Me
6540: 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a  m*)p4);.      }.
6550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6560: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56   }.    case P4_V
6570: 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66  TAB : {.      if
6580: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
6590: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
65a0: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
65b0: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  e *)p4);.      b
65c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
65d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
65e0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
65f0: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
6600: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
6610: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
6620: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
6630: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
6640: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
6650: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
6660: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
6670: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
6680: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
6690: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
66a0: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
66b0: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
66c0: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
66d0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61  ;.    for(pOp=&a
66e0: 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d  Op[nOp-1]; pOp>=
66f0: 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20  aOp; pOp--){.   
6700: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
6710: 70 65 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  pe ) freeP4(db, 
6720: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
6730: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
6740: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
6750: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
6760: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6770: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
6780: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
6790: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c    .    }.    sql
67a0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
67b0: 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   aOp);.  }.}../*
67c0: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
67d0: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
67e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
67f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
6800: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
6810: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
6820: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
6830: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
6840: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
6850: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
6860: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
6870: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
6880: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
6890: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
68a0: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
68b0: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
68c0: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
68d0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
68e0: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
68f0: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
6900: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
6910: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
6920: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73  OP_Noop.*/.int s
6930: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6940: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
6950: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62  int addr){.  Vdb
6960: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
6970: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6980: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
6990: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
69a0: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
69b0: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e   );.  pOp = &p->
69c0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
69d0: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
69e0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
69f0: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70  p);.  pOp->p4typ
6a00: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
6a10: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b    pOp->p4.z = 0;
6a20: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
6a30: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75   OP_Noop;.  retu
6a40: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
6a50: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
6a60: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
6a70: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
6a80: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
6a90: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
6aa0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
6ab0: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
6ac0: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
6ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6ae0: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
6af0: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
6b00: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  8 op){.  if( p->
6b10: 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b  nOp>0 && p->aOp[
6b20: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
6b30: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ==op ){.    retu
6b40: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  rn sqlite3VdbeCh
6b50: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
6b60: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  >nOp-1);.  }else
6b70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6b80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
6b90: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6ba0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
6bb0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
6bc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
6bd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6be0: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
6bf0: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
6c00: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
6c10: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
6c20: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
6c30: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
6c40: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
6c50: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
6c60: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
6c70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
6c80: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
6c90: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
6ca0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
6cb0: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
6cc0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
6cd0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
6ce0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
6cf0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
6d00: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
6d10: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
6d20: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
6d30: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
6d40: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
6d50: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
6d60: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
6d70: 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  P4..** .** Other
6d80: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
6d90: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
6da0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
6db0: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
6dc0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
6dd0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
6de0: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
6df0: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
6e00: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
6e10: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
6e20: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
6e30: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
6e40: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
6e50: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
6e60: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
6e70: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
6e80: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
6e90: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
6ea0: 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  d SQLITE_NOINLIN
6eb0: 45 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75  E vdbeChangeP4Fu
6ec0: 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20  ll(.  Vdbe *p,. 
6ed0: 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73   Op *pOp,.  cons
6ee0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69  t char *zP4,.  i
6ef0: 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f  nt n.){.  if( pO
6f00: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
6f10: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
6f20: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
6f30: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d  >p4.p);.    pOp-
6f40: 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  >p4type = 0;.   
6f50: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
6f60: 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b    }.  if( n<0 ){
6f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f80: 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74  ChangeP4(p, (int
6f90: 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c  )(pOp - p->aOp),
6fa0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73   zP4, n);.  }els
6fb0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
6fc0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
6fd0: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
6fe0: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
6ff0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
7000: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
7010: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
7020: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
7030: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7040: 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a  eChangeP4(Vdbe *
7050: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
7060: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e  st char *zP4, in
7070: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
7080: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7090: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
70a0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
70b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
70c0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
70d0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
70e0: 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62   p->aOp!=0 || db
70f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7100: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
7110: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7120: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
7130: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
7140: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
7150: 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  zP4);.    return
7160: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7170: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
7180: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
7190: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
71a0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
71b0: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
71c0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
71d0: 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d  addr];.  if( n>=
71e0: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65  0 || pOp->p4type
71f0: 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e   ){.    vdbeChan
7200: 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c  geP4Full(p, pOp,
7210: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65   zP4, n);.    re
7220: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
7230: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
7240: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
7250: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
7260: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
7270: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
7280: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
7290: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
72a0: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
72b0: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
72c0: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
72d0: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
72e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
72f0: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
7300: 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20   if( zP4!=0 ){. 
7310: 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29     assert( n<0 )
7320: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
7330: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
7340: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7350: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
7360: 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54      if( n==P4_VT
7370: 41 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  AB ) sqlite3Vtab
7380: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50  Lock((VTable*)zP
7390: 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  4);.  }.}../*.**
73a0: 20 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 6f   Change the P4 o
73b0: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f  perand of the mo
73c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
73d0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a  d instruction .*
73e0: 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 64  * to the value d
73f0: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 61 72  efined by the ar
7400: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69  guments.  This i
7410: 73 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  s a high-speed.*
7420: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  * version of sql
7430: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
7440: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  ()..**.** The P4
7450: 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f   operand must no
7460: 74 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76  t have been prev
7470: 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e 20  iously defined. 
7480: 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20   And the new.** 
7490: 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 50  P4 must not be P
74a0: 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73 71  4_INT32.  Use sq
74b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
74c0: 34 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f 66  4() in either of
74d0: 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73 2e  .** those cases.
74e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
74f0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 56 64 62  VdbeAppendP4(Vdb
7500: 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c  e *p, void *pP4,
7510: 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f   int n){.  VdbeO
7520: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
7530: 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26 26  ( n!=P4_INT32 &&
7540: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20   n!=P4_VTAB );. 
7550: 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b   assert( n<=0 );
7560: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
7570: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7580: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
7590: 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65  n, pP4);.  }else
75a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
75b0: 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  4!=0 );.    asse
75c0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
75d0: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
75e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20  p[p->nOp-1];.   
75f0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
7600: 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44  type==P4_NOTUSED
7610: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   );.    pOp->p4t
7620: 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70  ype = n;.    pOp
7630: 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20  ->p4.p = pP4;.  
7640: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
7650: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
7660: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
7670: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
7680: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
7690: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
76a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
76b0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
76c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
76d0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
76e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
76f0: 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f  pVdbe;.  KeyInfo
7700: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73   *pKeyInfo;.  as
7710: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
7720: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
7730: 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  );.  pKeyInfo = 
7740: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
7750: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
7760: 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  dx);.  if( pKeyI
7770: 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62  nfo ) sqlite3Vdb
7780: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
7790: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
77a0: 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  O);.}..#ifdef SQ
77b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
77c0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
77d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
77e0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  mment on the mos
77f0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
7800: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
7810: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
7820: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
7830: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
7840: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
7850: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
7860: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
7870: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
7880: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
7890: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
78a0: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
78b0: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
78c0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
78d0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
78e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
78f0: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
7900: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
7910: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
7920: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7930: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
7940: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
7950: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
7960: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7970: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
7980: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
7990: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
79a0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
79b0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
79c0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
79d0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
79e0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
79f0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
7a00: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
7a10: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
7a20: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
7a30: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
7a40: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
7a50: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
7a60: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7a70: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
7a80: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
7a90: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
7aa0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
7ab0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
7ac0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7ad0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
7ae0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
7af0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
7b00: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
7b10: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
7b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
7b30: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
7b40: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
7b50: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
7b60: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
7b70: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
7b80: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
7b90: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
7ba0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
7bb0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
7bc0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
7bd0: 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63  alue if the iSrc
7be0: 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74  Line field for t
7bf0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  he previously co
7c00: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
7c10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c20: 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65  VdbeSetLineNumbe
7c30: 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  r(Vdbe *v, int i
7c40: 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Line){.  sqlite3
7c50: 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d  VdbeGetOp(v,-1)-
7c60: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
7c70: 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
7c80: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
7c90: 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AGE */../*.** Re
7ca0: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
7cb0: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
7cc0: 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64  ess.  If the add
7cd0: 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e  ress is -1, then
7ce0: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d  .** return the m
7cf0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
7d00: 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  erted opcode..**
7d10: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
7d20: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7d30: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72   has occurred pr
7d40: 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69  ior to the calli
7d50: 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f  ng of this.** ro
7d60: 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f  utine, then a po
7d70: 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79  inter to a dummy
7d80: 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20   VdbeOp will be 
7d90: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20  returned.  That 
7da0: 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61  opcode.** is rea
7db0: 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72  dable but not wr
7dc0: 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69  itable, though i
7dd0: 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77  t is cast to a w
7de0: 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a  ritable value..*
7df0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20  * The return of 
7e00: 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61  a dummy opcode a
7e10: 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74  llows the call t
7e20: 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74  o continue funct
7e30: 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20  ioning.** after 
7e40: 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74  an OOM fault wit
7e50: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
7e60: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
7e70: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
7e80: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7e90: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
7ea0: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
7eb0: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
7ec0: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
7ed0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
7ee0: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
7ef0: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
7f00: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
7f10: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
7f20: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
7f30: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
7f40: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
7f50: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
7f60: 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66  .  /* C89 specif
7f70: 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ies that the con
7f80: 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69  stant "dummy" wi
7f90: 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
7fa0: 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65  d to all.  ** ze
7fb0: 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f  ros, which is co
7fc0: 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e  rrect.  MSVC gen
7fd0: 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67  erates a warning
7fe0: 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20  , nevertheless. 
7ff0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65  */.  static Vdbe
8000: 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67  Op dummy;  /* Ig
8010: 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61  nore the MSVC wa
8020: 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69  rning about no i
8030: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20  nitializer */.  
8040: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
8050: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
8060: 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  T );.  if( addr<
8070: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
8080: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
8090: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
80a0: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
80b0: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
80c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
80d0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
80e0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
80f0: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
8100: 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ummy;.  }else{. 
8110: 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f     return &p->aO
8120: 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a  p[addr];.  }.}..
8130: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8140: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
8150: 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a  N_COMMENTS)./*.*
8160: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
8170: 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e  ger value for on
8180: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
8190: 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64  ers to the opcod
81a0: 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69  e pOp.** determi
81b0: 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72  ned by character
81c0: 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c..*/.static in
81d0: 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61  t translateP(cha
81e0: 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70  r c, const Op *p
81f0: 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31  Op){.  if( c=='1
8200: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
8210: 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27  p1;.  if( c=='2'
8220: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
8230: 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20  2;.  if( c=='3' 
8240: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33  ) return pOp->p3
8250: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29  ;.  if( c=='4' )
8260: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e   return pOp->p4.
8270: 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d  i;.  return pOp-
8280: 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  >p5;.}../*.** Co
8290: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66  mpute a string f
82a0: 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22  or the "comment"
82b0: 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45   field of a VDBE
82c0: 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e   opcode listing.
82d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70  .**.** The Synop
82e0: 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f  sis: field in co
82f0: 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64  mments in the vd
8300: 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65  be.c source file
8310: 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a   gets converted.
8320: 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73  ** to an extra s
8330: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70  tring that is ap
8340: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71  pended to the sq
8350: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8360: 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62  ).  In the.** ab
8370: 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63  sence of other c
8380: 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79  omments, this sy
8390: 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74  nopsis becomes t
83a0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
83b0: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d  e opcode..** Som
83c0: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63  e translation oc
83d0: 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  curs:.**.**     
83e0: 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20    "PX"      ->  
83f0: 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20  "r[X]".**       
8400: 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72  "PX@PY"   ->  "r
8410: 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20  [X..X+Y-1]"  or 
8420: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
8430: 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22   or 1.**       "
8440: 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b  PX@PY+1" ->  "r[
8450: 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22  X..X+Y]"    or "
8460: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a  r[x]" if y is 0.
8470: 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59  **       "PY..PY
8480: 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22  "  ->  "r[X..Y]"
8490: 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20        or "r[x]" 
84a0: 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69  if y<=x.*/.stati
84b0: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d  c int displayCom
84c0: 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70  ment(.  const Op
84d0: 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68   *pOp,     /* Th
84e0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63  e opcode to be c
84f0: 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f  ommented */.  co
8500: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
8510: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f   /* Previously o
8520: 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f  btained value fo
8530: 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a  r P4 */.  char *
8540: 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20  zTemp,       /* 
8550: 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72  Write result her
8560: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70  e */.  int nTemp
8570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
8580: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ce available in 
8590: 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  zTemp[] */.){.  
85a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e  const char *zOpN
85b0: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
85c0: 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20  r *zSynopsis;.  
85d0: 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69  int nOpName;.  i
85e0: 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61  nt ii, jj;.  cha
85f0: 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f  r zAlt[50];.  zO
8600: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  pName = sqlite3O
8610: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8620: 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d  pcode);.  nOpNam
8630: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
8640: 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20  n30(zOpName);.  
8650: 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e  if( zOpName[nOpN
8660: 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e  ame+1] ){.    in
8670: 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20  t seenCom = 0;. 
8680: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a     char c;.    z
8690: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61  Synopsis = zOpNa
86a0: 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20  me += nOpName + 
86b0: 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  1;.    if( strnc
86c0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46  mp(zSynopsis,"IF
86d0: 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20   ",3)==0 ){.    
86e0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
86f0: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
8700: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8710: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
8720: 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22  f(zAlt), zAlt, "
8730: 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a  r[P2] = (%s)", z
8740: 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20  Synopsis+3);.   
8750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8760: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8770: 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c  tf(sizeof(zAlt),
8780: 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67 6f   zAlt, "if %s go
8790: 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69  to P2", zSynopsi
87a0: 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s+3);.      }.  
87b0: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
87c0: 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zAlt;.    }.    
87d0: 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c  for(ii=jj=0; jj<
87e0: 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20  nTemp-1 && (c = 
87f0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d  zSynopsis[ii])!=
8800: 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  0; ii++){.      
8810: 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20  if( c=='P' ){.  
8820: 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70        c = zSynop
8830: 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20  sis[++ii];.     
8840: 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b     if( c=='4' ){
8850: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8860: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8870: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8880: 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20  "%s", zP4);.    
8890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
88a0: 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='X' ){.        
88b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
88c0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
88d0: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70  mp+jj, "%s", pOp
88e0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
88f0: 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d         seenCom =
8900: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
8910: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
8920: 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v1 = translateP
8930: 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  (c, pOp);.      
8940: 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20      int v2;.    
8950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8960: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
8970: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c   zTemp+jj, "%d",
8980: 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   v1);.          
8990: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
89a0: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22  opsis+ii+1, "@P"
89b0: 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 2)==0 ){.     
89c0: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a         ii += 3;.
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b              jj +
89e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
89f0: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
8a00: 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72           v2 = tr
8a10: 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73  anslateP(zSynops
8a20: 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20  is[ii], pOp);.  
8a30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
8a40: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
8a50: 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20  ii+1,"+1",2)==0 
8a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8a70: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   ii += 2;.      
8a80: 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20          v2++;.  
8a90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8aa0: 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31          if( v2>1
8ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ac0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8ad0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
8ae0: 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76  mp+jj, "..%d", v
8af0: 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20  1+v2-1);.       
8b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b10: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
8b20: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8b30: 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30  1, "..P3", 4)==0
8b40: 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29   && pOp->p3==0 )
8b50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
8b60: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
8b70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8b80: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
8b90: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
8ba0: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +jj);.      }els
8bb0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  e{.        zTemp
8bc0: 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  [jj++] = c;.    
8bd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8be0: 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a  ( !seenCom && jj
8bf0: 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d  <nTemp-5 && pOp-
8c00: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
8c10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8c20: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8c30: 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20  emp+jj, "; %s", 
8c40: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
8c50: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
8c60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
8c70: 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p+jj);.    }.   
8c80: 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20   if( jj<nTemp ) 
8c90: 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20  zTemp[jj] = 0;. 
8ca0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
8cb0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
8cc0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8cd0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8ce0: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
8cf0: 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71  nt);.    jj = sq
8d00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
8d10: 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  emp);.  }else{. 
8d20: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
8d30: 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d  .    jj = 0;.  }
8d40: 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a  .  return jj;.}.
8d50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8d60: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56  _DEBUG */..#if V
8d70: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
8d80: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8d90: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8da0: 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  INTS)./*.** Tran
8db0: 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78  slate the P4.pEx
8dc0: 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20  pr value for an 
8dd0: 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70  OP_CursorHint op
8de0: 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a  code into text.*
8df0: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69  * that can be di
8e00: 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50  splayed in the P
8e10: 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c  4 column of EXPL
8e20: 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73  AIN output..*/.s
8e30: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
8e40: 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63 75  ayP4Expr(StrAccu
8e50: 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70  m *p, Expr *pExp
8e60: 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
8e70: 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69   *zOp = 0;.  swi
8e80: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8e90: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  {.    case TK_ST
8ea0: 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69  RING:.      sqli
8eb0: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
8ec0: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
8ed0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
8ee0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8ef0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71  NTEGER:.      sq
8f00: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8f10: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
8f20: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
8f30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f40: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c  _NULL:.      sql
8f50: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8f60: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72  NULL");.      br
8f70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f80: 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
8f90: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8fa0: 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45  f(p, "r[%d]", pE
8fb0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
8fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8fd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
8fe0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
8ff0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
9000: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
9010: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
9020: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
9030: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9040: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9050: 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70  "c%d", (int)pExp
9060: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
9070: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9090: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70   TK_LT:      zOp
90a0: 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72   = "LT";      br
90b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
90c0: 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LE:      zOp = 
90d0: 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LE";      break
90e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
90f0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54  :      zOp = "GT
9100: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9110: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20     case TK_GE:  
9120: 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20      zOp = "GE"; 
9130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9140: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
9150: 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20   zOp = "NE";    
9160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9170: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f  e TK_EQ:      zO
9180: 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62  p = "EQ";      b
9190: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
91a0: 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_IS:      zOp =
91b0: 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65 61   "IS";      brea
91c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
91d0: 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49  SNOT:   zOp = "I
91e0: 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SNOT";   break;.
91f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
9200: 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22       zOp = "AND"
9210: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9220: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
9230: 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20    zOp = "OR";   
9240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9250: 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a  se TK_PLUS:    z
9260: 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20  Op = "ADD";     
9270: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9280: 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20  TK_STAR:    zOp 
9290: 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65  = "MUL";     bre
92a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
92b0: 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  MINUS:   zOp = "
92c0: 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  SUB";     break;
92d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
92e0: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d  :     zOp = "REM
92f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9300: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
9310: 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44  :  zOp = "BITAND
9320: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
9330: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
9340: 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20  zOp = "BITOR";  
9350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9360: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70   TK_SLASH:   zOp
9370: 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62 72   = "DIV";     br
9380: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9390: 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _LSHIFT:  zOp = 
93a0: 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "LSHIFT";  break
93b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
93c0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53  HIFT:  zOp = "RS
93d0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
93e0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
93f0: 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41  T:  zOp = "CONCA
9400: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
9410: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
9420: 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20   zOp = "MINUS"; 
9430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9440: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f  e TK_UPLUS:   zO
9450: 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62  p = "PLUS";    b
9460: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9470: 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d  K_BITNOT:  zOp =
9480: 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61   "BITNOT";  brea
9490: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
94a0: 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e  OT:     zOp = "N
94b0: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
94c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
94d0: 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55  LL:  zOp = "ISNU
94e0: 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  LL";  break;.   
94f0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
9500: 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c  : zOp = "NOTNULL
9510: 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64  "; break;..    d
9520: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71  efault:.      sq
9530: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9540: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
9550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9560: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
9570: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9580: 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b  (p, "%s(", zOp);
9590: 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78  .    displayP4Ex
95a0: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pr(p, pExpr->pLe
95b0: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ft);.    if( pEx
95c0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
95d0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
95e0: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c 22  cumAppend(p, ","
95f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73 70  , 1);.      disp
9600: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
9610: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9620: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74   }.    sqlite3St
9630: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20  rAccumAppend(p, 
9640: 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23  ")", 1);.  }.}.#
9650: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
9660: 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69  SPLAY_P4 && defi
9670: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9680: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20  E_CURSOR_HINTS) 
9690: 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49  */...#if VDBE_DI
96a0: 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43  SPLAY_P4./*.** C
96b0: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
96c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
96d0: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
96e0: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
96f0: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
9700: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
9710: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
9720: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
9730: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
9740: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
9750: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
9760: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
9770: 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d  Temp;.  StrAccum
9780: 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54   x;.  assert( nT
9790: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c  emp>=20 );.  sql
97a0: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
97b0: 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e  (&x, 0, zTemp, n
97c0: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74  Temp, 0);.  swit
97d0: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
97e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
97f0: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
9800: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79  int j;.      Key
9810: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
9820: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
9830: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
9840: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
9850: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
9860: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9870: 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65  (&x, "k(%d", pKe
9880: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a  yInfo->nField);.
9890: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
98a0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
98b0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
98c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
98d0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
98e0: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f  l[j];.        co
98f0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
9900: 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d  = pColl ? pColl-
9910: 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20  >zName : "";.   
9920: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
9930: 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29  zColl, "BINARY")
9940: 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42  ==0 ) zColl = "B
9950: 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ";.        sqlit
9960: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c  e3XPrintf(&x, ",
9970: 25 73 25 73 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  %s%s", pKeyInfo-
9980: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f  >aSortOrder[j] ?
9990: 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c   "-" : "", zColl
99a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
99b0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
99c0: 41 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c 20  Append(&x, ")", 
99d0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
99e0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
99f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9a00: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
9a10: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
9a20: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
9a30: 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78  (&x, pOp->p4.pEx
9a40: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
9a50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9a60: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
9a70: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
9a80: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
9a90: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
9aa0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9ab0: 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20  (&x, "(%.20s)", 
9ac0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
9ad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9ae0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
9af0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
9b00: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
9b10: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
9b20: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9b30: 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  tf(&x, "%s(%d)",
9b40: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
9b50: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
9b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
9b70: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9b80: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
9b90: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
9ba0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
9bb0: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75  CCTX: {.      Fu
9bc0: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
9bd0: 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e  p->p4.pCtx->pFun
9be0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
9bf0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28  XPrintf(&x, "%s(
9c00: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9c10: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
9c40: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
9c50: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9c60: 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ntf(&x, "%lld", 
9c70: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
9c80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c90: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
9ca0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
9cb0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9cc0: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
9cd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9ce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
9cf0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
9d00: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9d10: 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  x, "%.16g", *pOp
9d20: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
9d30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d40: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
9d50: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
9d60: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
9d70: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
9d80: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
9d90: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
9da0: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
9db0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
9dc0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
9dd0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
9de0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9df0: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
9e00: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
9e10: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
9e20: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
9e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
9e40: 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67  rintf(&x, "%.16g
9e50: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20  ", pMem->u.r);. 
9e60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
9e70: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9e80: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Null ){.       
9e90: 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20   zP4 = "NULL";. 
9ea0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9eb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
9ec0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
9ed0: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
9ee0: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
9ef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
9f00: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
9f10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9f20: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
9f30: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
9f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
9f50: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
9f60: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
9f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9f80: 69 6e 74 66 28 26 78 2c 20 22 76 74 61 62 3a 25  intf(&x, "vtab:%
9f90: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
9fa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9fb0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
9fc0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
9fd0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
9fe0: 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e   int *ai = pOp->
9ff0: 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74  p4.ai;.      int
a000: 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a   n = ai[0];   /*
a010: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
a020: 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41  nt of an INTARRA
a030: 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a  Y is always the.
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20         ** count 
a060: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a070: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c   elements to fol
a080: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  low */.      for
a090: 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=1; i<n; i++){
a0a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a0b0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 64  XPrintf(&x, ",%d
a0c0: 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20  ", ai[i]);.     
a0d0: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   }.      zTemp[0
a0e0: 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73  ] = '[';.      s
a0f0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
a100: 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31 29  pend(&x, "]", 1)
a110: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a120: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
a130: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
a140: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
a150: 6e 74 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d  ntf(&x, "program
a160: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
a170: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a180: 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20  P4_ADVANCE: {.  
a190: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
a1a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a1b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
a1c0: 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  _TABLE: {.      
a1d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
a1e0: 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  x, "%s", pOp->p4
a1f0: 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pTab->zName);. 
a200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a210: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
a220: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
a230: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
a240: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
a250: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
a260: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
a270: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
a280: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a290: 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
a2a0: 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (&x);.  assert( 
a2b0: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
a2c0: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
a2d0: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
a2e0: 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  _P4 */../*.** De
a2f0: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
a300: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
a310: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
a320: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
a330: 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65  *.** The prepare
a340: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65  d statements nee
a350: 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76  d to know in adv
a360: 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  ance the complet
a370: 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61  e set of.** atta
a380: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
a390: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e  hat will be use.
a3a0: 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73    A mask of thes
a3b0: 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69  e databases.** i
a3c0: 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20  s maintained in 
a3d0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54  p->btreeMask.  T
a3e0: 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76  he p->lockMask v
a3f0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73  alue is the subs
a400: 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65  et of.** p->btre
a410: 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73  eMask of databas
a420: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71  es that will req
a430: 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a  uire a lock..*/.
a440: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a450: 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a  UsesBtree(Vdbe *
a460: 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73  p, int i){.  ass
a470: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
a480: 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28  ->db->nDb && i<(
a490: 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61  int)sizeof(yDbMa
a4a0: 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72  sk)*8 );.  asser
a4b0: 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  t( i<(int)sizeof
a4c0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38  (p->btreeMask)*8
a4d0: 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28   );.  DbMaskSet(
a4e0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29  p->btreeMask, i)
a4f0: 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20  ;.  if( i!=1 && 
a500: 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
a510: 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b  able(p->db->aDb[
a520: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44  i].pBt) ){.    D
a530: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b  bMaskSet(p->lock
a540: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  Mask, i);.  }.}.
a550: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a560: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a570: 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66  _CACHE)./*.** If
a580: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
a590: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
a5a0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
a5b0: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
a5c0: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
a5d0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
a5e0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
a5f0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
a600: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
a610: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
a620: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
a630: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
a640: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
a650: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
a660: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
a670: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
a680: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
a690: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
a6a0: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
a6b0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
a6c0: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
a6d0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
a6e0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
a6f0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
a700: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
a710: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
a720: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
a730: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
a740: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
a750: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
a760: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
a770: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
a780: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
a790: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
a7a0: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
a7b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
a7c0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
a7d0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
a7e0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
a7f0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
a800: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
a810: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
a820: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
a830: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
a840: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
a850: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
a860: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
a870: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
a880: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
a890: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
a8a0: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
a8b0: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
a8c0: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
a8d0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
a8e0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
a8f0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
a900: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
a910: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
a920: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a930: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
a940: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
a950: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
a960: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
a970: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
a980: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
a990: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
a9a0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
a9b0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
a9c0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44  int nDb;.  if( D
a9d0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
a9e0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
a9f0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
aa00: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
aa10: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
aa20: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
aa30: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
aa40: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
aa50: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
aa60: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
aa70: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
aa80: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
aa90: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
aaa0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
aab0: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
aac0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
aad0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
aae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
aaf0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
ab00: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
ab10: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c  /*.** Unlock all
ab20: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70   of the btrees p
ab30: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64  reviously locked
ab40: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
ab50: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29  lite3VdbeEnter()
ab60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
ab70: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
ab80: 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20   vdbeLeave(Vdbe 
ab90: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
aba0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
abb0: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
abc0: 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
abd0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
abe0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
abf0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
ac00: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
ac10: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
ac20: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
ac30: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
ac40: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
ac50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ac60: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
ac70: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
ac80: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
ac90: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
aca0: 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  {.  if( DbMaskAl
acb0: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
acc0: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
acd0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
ace0: 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28   */.  vdbeLeave(
acf0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  p);.}.#endif..#i
ad00: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
ad10: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
ad20: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
ad30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
ad40: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
ad50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
ad60: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
ad70: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
ad80: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
ad90: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
ada0: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
adb0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
adc0: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
add0: 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b   char zCom[100];
ade0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
adf0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
ae00: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
ae10: 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e  %4d %4d %-13s %.
ae20: 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  2X %s\n";.  if( 
ae30: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
ae40: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d   stdout;.  zP4 =
ae50: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
ae60: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
ae70: 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  r));.#ifdef SQLI
ae80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
ae90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73  N_COMMENTS.  dis
aea0: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
aeb0: 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65   zP4, zCom, size
aec0: 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65  of(zCom));.#else
aed0: 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a  .  zCom[0] = 0;.
aee0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20  #endif.  /* NB: 
aef0: 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   The sqlite3Opco
af00: 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f  deName() functio
af10: 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
af20: 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64   by code created
af30: 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f  .  ** by the mko
af40: 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d  pcodeh.awk and m
af50: 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72  kopcodec.awk scr
af60: 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61  ipts which extra
af70: 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f  ct the.  ** info
af80: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
af90: 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74   vdbe.c source t
afa0: 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ext */.  fprintf
afb0: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
afc0: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
afd0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
afe0: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
aff0: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
b000: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
b010: 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a  >p5,.      zCom.
b020: 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f    );.  fflush(pO
b030: 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
b040: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b050: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
b060: 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  m element..*/.st
b070: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65  atic void initMe
b080: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
b090: 6e 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64  nt N, sqlite3 *d
b0a0: 62 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20  b, u16 flags){. 
b0b0: 20 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20   while( (N--)>0 
b0c0: 29 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  ){.    p->db = d
b0d0: 62 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  b;.    p->flags 
b0e0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e  = flags;.    p->
b0f0: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69  szMalloc = 0;.#i
b100: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
b110: 47 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46  G.    p->pScopyF
b120: 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
b130: 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a      p++;.  }.}..
b140: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
b150: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
b160: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
b170: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
b180: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
b190: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
b1a0: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
b1b0: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
b1c0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
b1d0: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
b1e0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
b1f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20   ){.      do{.  
b200: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
b210: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
b220: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
b230: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68  lloc);.      }wh
b240: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
b250: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
b260: 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
b270: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
b280: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
b290: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
b2a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b2b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
b2c0: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29  MemInvariants(p)
b2d0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   );..      /* Th
b2e0: 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c  is block is real
b2f0: 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65  ly an inlined ve
b300: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
b310: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29  VdbeMemRelease()
b320: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
b330: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f  akes advantage o
b340: 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  f the fact that 
b350: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
b360: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20  value is .      
b370: 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  ** being set to 
b380: 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61  NULL after relea
b390: 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63  sing any dynamic
b3a0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
b3b0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
b3c0: 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  e justification 
b3d0: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20  for duplicating 
b3e0: 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63  code is that acc
b3f0: 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20  ording to .     
b400: 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74   ** callgrind, t
b410: 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72  his causes a cer
b420: 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74  tain test case t
b430: 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e  o hit the CPU 4.
b440: 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63  7 .      ** perc
b450: 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69  ent less (x86 li
b460: 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e  nux, gcc version
b470: 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61   4.1.2, -O6) tha
b480: 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73  n if .      ** s
b490: 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65  qlite3MemRelease
b4a0: 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66  () were called f
b4b0: 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d  rom here. With -
b4c0: 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20  O2, this jumps. 
b4d0: 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70       ** to 6.6 p
b4e0: 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74  ercent. The test
b4f0: 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69   case is inserti
b500: 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74  ng 1000 rows int
b510: 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20  o a table .     
b520: 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65   ** with no inde
b530: 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67  xes using a sing
b540: 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45  le prepared INSE
b550: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  RT statement, bi
b560: 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61  nd() .      ** a
b570: 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65  nd reset(). Inse
b580: 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  rts are grouped 
b590: 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69  into a transacti
b5a0: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
b5b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
b5c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20  flags & MEM_Agg 
b5d0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b5e0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
b5f0: 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74  M_Dyn );.      t
b600: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
b610: 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b  s & MEM_Frame );
b620: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b630: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
b640: 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20  RowSet );.      
b650: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
b660: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
b670: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
b680: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
b690: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
b6a0: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
b6b0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61  else if( p->szMa
b6c0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
b6d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
b6e0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
b6f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61  .        p->szMa
b700: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
b710: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
b720: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
b730: 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  d;.    }while( (
b740: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  ++p)<pEnd );.  }
b750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
b760: 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a   a VdbeFrame obj
b770: 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  ect and its cont
b780: 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20  ents. VdbeFrame 
b790: 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61  objects are.** a
b7a0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
b7b0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
b7c0: 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65  e in sqlite3Vdbe
b7d0: 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Exec()..*/.void 
b7e0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
b7f0: 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65  Delete(VdbeFrame
b800: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
b810: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62   Mem *aMem = Vdb
b820: 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20  eFrameMem(p);.  
b830: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43  VdbeCursor **apC
b840: 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
b850: 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68   **)&aMem[p->nCh
b860: 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69  ildMem];.  for(i
b870: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
b880: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
b890: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
b8a0: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
b8b0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
b8c0: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
b8d0: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
b8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
b8f0: 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d  eteAuxData(p->v-
b900: 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
b910: 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c  a, -1, 0);.  sql
b920: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
b930: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
b940: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b950: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
b960: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
b970: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
b980: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
b990: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
b9a0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
b9b0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
b9c0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
b9d0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
b9e0: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
b9f0: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
ba00: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
ba10: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
ba20: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
ba30: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
ba40: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
ba50: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
ba60: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
ba70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
ba80: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
ba90: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
baa0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
bab0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
bac0: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
bad0: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
bae0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
baf0: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
bb00: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
bb10: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
bb20: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
bb30: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
bb40: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
bb50: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
bb60: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
bb70: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
bb80: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
bb90: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
bba0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
bbb0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
bbc0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
bbf0: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
bc20: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
bc30: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
bc40: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bc70: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
bc80: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
bc90: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
bca0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
bcb0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
bcc0: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
bcd0: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
bd00: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
bd10: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
bd20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
bd30: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
bd40: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
bd50: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
bd60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bd90: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
bda0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bdb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bdc0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
bdd0: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
bde0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
be00: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
be10: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
be20: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
be30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
be40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
be50: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
be60: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
be70: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
be80: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
be90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bea0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
beb0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
bec0: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
bed0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
bee0: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
bef0: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
bf00: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
bf10: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
bf20: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
bf30: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
bf40: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
bf50: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
bf60: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
bf70: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
bf80: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
bf90: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
bfa0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
bfb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bfc0: 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20  _BKPT ){.    /* 
bfd0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
bfe0: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
bff0: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
c000: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
c010: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
c020: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
c030: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
c040: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
c050: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
c060: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c070: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
c080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
c090: 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68  utput rows reach
c0a0: 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65  es nRow, that me
c0b0: 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  ans the.  ** lis
c0c0: 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  ting has finishe
c0d0: 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74  d and sqlite3_st
c0e0: 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75  ep() should retu
c0f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
c100: 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65    ** nRow is the
c110: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
c120: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
c130: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  e main program, 
c140: 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75  plus.  ** the su
c150: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
c160: 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74  of rows in all t
c170: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
c180: 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  ms encountered. 
c190: 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65   ** so far.  The
c1a0: 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c   nRow value will
c1b0: 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77   increase as new
c1c0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
c1d0: 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e  rams are.  ** en
c1e0: 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70  countered, but p
c1f0: 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75  ->pc will eventu
c200: 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f  ally catch up to
c210: 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52   nRow..  */.  nR
c220: 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  ow = p->nOp;.  i
c230: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
c240: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
c250: 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65  irst 8 memory ce
c260: 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  lls are used for
c270: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c280: 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20    So we will.   
c290: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74   ** commandeer t
c2a0: 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75  he 9th cell to u
c2b0: 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f  se as storage fo
c2c0: 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  r an array of po
c2d0: 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f  inters.    ** to
c2e0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
c2f0: 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20  rams.  The VDBE 
c300: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
c310: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39   have at least 9
c320: 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20  .    ** cells.  
c330: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
c340: 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20  ->nMem>9 );.    
c350: 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pSub = &p->aMem[
c360: 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  9];.    if( pSub
c370: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
c380: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20   ){.      /* On 
c390: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
c3a0: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
c3b0: 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64  , pSub will hold
c3c0: 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a   a NULL.  It is.
c3d0: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
c3e0: 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62  ized to a BLOB b
c3f0: 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47  y the P4_SUBPROG
c400: 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  RAM processing l
c410: 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ogic below */.  
c420: 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d      nSub = pSub-
c430: 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29  >n/sizeof(Vdbe*)
c440: 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20  ;.      apSub = 
c450: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
c460: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20  Sub->z;.    }.  
c470: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
c480: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  b; i++){.      n
c490: 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d  Row += apSub[i]-
c4a0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >nOp;.    }.  }.
c4b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
c4c0: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
c4d0: 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65  ( i<nRow && p->e
c4e0: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
c4f0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
c500: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
c510: 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20  f( i>=nRow ){.  
c520: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c530: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
c540: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
c550: 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  se if( db->u1.is
c560: 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20  Interrupted ){. 
c570: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
c580: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
c590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
c5a0: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OR;.    sqlite3V
c5b0: 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69  dbeError(p, sqli
c5c0: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
c5d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c5e0: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f  char *zP4;.    O
c5f0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20  p *pOp;.    if( 
c600: 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  i<p->nOp ){.    
c610: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
c620: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73  line number is s
c630: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74  mall enough that
c640: 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e   we are still in
c650: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61   the.      ** ma
c660: 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  in program. */. 
c670: 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61       pOp = &p->a
c680: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  Op[i];.    }else
c690: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72  {.      /* We ar
c6a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74  e currently list
c6b0: 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ing subprograms.
c6c0: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
c6d0: 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20  ch one and.     
c6e0: 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20   ** pick up the 
c6f0: 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f  appropriate opco
c700: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  de. */.      int
c710: 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70   j;.      i -= p
c720: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72  ->nOp;.      for
c730: 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a  (j=0; i>=apSub[j
c740: 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20  ]->nOp; j++){.  
c750: 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62        i -= apSub
c760: 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  [j]->nOp;.      
c770: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
c780: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
c790: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c7a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
c7b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c7c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
c7d0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
c7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
c810: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
c820: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
c830: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c840: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
c850: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
c860: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
c870: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
c880: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
c890: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
c8a0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
c8b0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
c8c0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
c8d0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
c8e0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
c8f0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c900: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
c910: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
c920: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
c930: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
c940: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
c950: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
c960: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
c970: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
c980: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
c990: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
c9a0: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
c9b0: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
c9c0: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
c9d0: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
c9e0: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
c9f0: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
ca00: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
ca10: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
ca20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ca30: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
ca40: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
ca50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
ca60: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
ca70: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
ca80: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
ca90: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
caa0: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
cab0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
cac0: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
cad0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
cae0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
caf0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
cb00: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
cb10: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
cb20: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e  w(pSub, nByte, n
cb30: 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Sub!=0) ){.     
cb40: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
cb50: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
cb60: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ->z;.          a
cb70: 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70  pSub[nSub++] = p
cb80: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  Op->p4.pProgram;
cb90: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
cba0: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c  >flags |= MEM_Bl
cbb0: 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ob;.          pS
cbc0: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
cbd0: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
cbe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cbf0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
cc00: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
cc10: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
cc20: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
cc50: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
cc60: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
cc70: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
cc80: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
cc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
ccb0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
ccc0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
ccd0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
cce0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
ccf0: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd10: 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P3 */.    pMem+
cd20: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +;..    if( sqli
cd30: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
cd40: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31  ndResize(pMem, 1
cd50: 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a  00) ){ /* P4 */.
cd60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cd70: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
cd80: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
cd90: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
cda0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
cdb0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
cdc0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50  MEM_Term;.    zP
cdd0: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
cde0: 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d  p, pMem->z, pMem
cdf0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  ->szMalloc);.   
ce00: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
ce10: 7a 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  z ){.      pMem-
ce20: 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  >n = 0;.      sq
ce30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
ce40: 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31  tr(pMem, zP4, -1
ce50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
ce60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ce70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
ce80: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
ce90: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
cea0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
ceb0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
cec0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
ced0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
cee0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
cef0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
cf00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
cf10: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
cf20: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29  esize(pMem, 4) )
cf30: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
cf40: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
cf50: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
cf60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
cf70: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
cf80: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
cf90: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
cfa0: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
cfb0: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  n = 2;.      sql
cfc0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
cfd0: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
cfe0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
cff0: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P5 */.      pMe
d000: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
d010: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
d020: 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51  ++;.  .#ifdef SQ
d030: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
d040: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
d050: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
d060: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
d070: 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29  ize(pMem, 500) )
d080: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d090: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
d0a0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
d0b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
d0c0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
d0d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
d0e0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
d0f0: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
d100: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
d110: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
d120: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
d130: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
d140: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65  LITE_UTF8;.#else
d150: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
d160: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
d190: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  */.#endif.    }.
d1a0: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
d1b0: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
d1c0: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
d1d0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
d1e0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
d1f0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d200: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
d210: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
d220: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
d230: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d240: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
d250: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d260: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
d270: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
d280: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
d290: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
d2a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
d2b0: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
d2c0: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
d2d0: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
d2e0: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
d2f0: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
d300: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
d310: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
d320: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
d330: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
d340: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
d350: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
d360: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
d370: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
d380: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
d390: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
d3a0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
d3b0: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
d3c0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
d3d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
d3e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d3f0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
d400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
d410: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
d420: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
d430: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
d440: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
d450: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d460: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
d470: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
d480: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
d490: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
d4a0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
d4b0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
d4c0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
d4d0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
d4e0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
d4f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
d500: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
d510: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
d520: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
d530: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
d540: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
d550: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
d560: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
d570: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
d580: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
d590: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
d5a0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
d5b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d5c0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
d5d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
d5e0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
d5f0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
d600: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
d610: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d620: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
d630: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
d640: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
d650: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
d660: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
d670: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
d680: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
d690: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
d6a0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
d6b0: 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
d6c0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
d6d0: 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d  describes bulk m
d6e0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
d6f0: 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75  for use.** by su
d700: 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61  bcomponents of a
d710: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
d720: 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61  ent.  Space is a
d730: 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20  llocated out.** 
d740: 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61  of a ReusableSpa
d750: 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65  ce object by the
d760: 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f   allocSpace() ro
d770: 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  utine below..*/.
d780: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
d790: 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70  pace {.  u8 *pSp
d7a0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ace;          /*
d7b0: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
d7c0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  y */.  int nFree
d7d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
d7e0: 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
d7f0: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  e memory */.  in
d800: 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20  t nNeeded;      
d810: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65     /* Total byte
d820: 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74  s that could not
d830: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f   be allocated */
d840: 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61  .};../* Try to a
d850: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
d860: 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  tes of 8-byte al
d870: 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72  igned bulk memor
d880: 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72  y for pBuf.** fr
d890: 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  om the ReusableS
d8a0: 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65  pace object.  Re
d8b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
d8c0: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a  o the allocated.
d8d0: 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63  ** memory on suc
d8e0: 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66  cess.  If insuff
d8f0: 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73  icient memory is
d900: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
d910: 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61  e.** ReusableSpa
d920: 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65  ce object, incre
d930: 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65  ase the Reusable
d940: 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a  Space.nNeeded.**
d950: 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d   value by the am
d960: 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20  ount needed and 
d970: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
d980: 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  ** If pBuf is no
d990: 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  t initially NULL
d9a0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
d9b0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73  t the memory has
d9c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
d9d0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20   allocated by a 
d9e0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
d9f0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a  is routine, so j
da00: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70  ust return a cop
da10: 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64  y.** of pBuf and
da20: 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53   leave ReusableS
da30: 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  pace unchanged..
da40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63  **.** This alloc
da50: 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64  ator is employed
da60: 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e   to repurpose un
da70: 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68  used slots at th
da80: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
da90: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20  opcode array of 
daa0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66  prepared state f
dab0: 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20  or other memory 
dac0: 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65  needs of the pre
dad0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
dae0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
daf0: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
db00: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
db10: 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42  eSpace *p,  /* B
db20: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
db30: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
db40: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
db50: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
db60: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
db70: 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74   a prior allocat
db80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ion */.  int nBy
db90: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
dba0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d     /* Bytes of m
dbb0: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
dbc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
dbd0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
dbe0: 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a  T(p->pSpace) );.
dbf0: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
dc00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
dc10: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
dc20: 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e  if( nByte <= p->
dc30: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  nFree ){.      p
dc40: 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65  ->nFree -= nByte
dc50: 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
dc60: 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72  p->pSpace[p->nFr
dc70: 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ee];.    }else{.
dc80: 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64        p->nNeeded
dc90: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
dca0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
dcb0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
dcc0: 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72  ENT(pBuf) );.  r
dcd0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
dce0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
dcf0: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
dd00: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
dd10: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
dd20: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
dd30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
dd40: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
dd50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
dd60: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
dd70: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
dd80: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
dd90: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
dda0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ddb0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
ddc0: 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e  AGIC_INIT || p->
ddd0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
dde0: 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a  C_RESET );..  /*
ddf0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
de00: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
de10: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
de20: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
de30: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
de40: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
de50: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
de60: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
de70: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
de80: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
de90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
dea0: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
deb0: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
dec0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
ded0: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
dee0: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
def0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
df00: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
df10: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
df20: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
df30: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
df40: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
df50: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
df60: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
df70: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
df80: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
df90: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
dfa0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
dfb0: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
dfc0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
dfd0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
dfe0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
dff0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
e000: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
e010: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
e020: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
e030: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
e040: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
e050: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
e060: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
e070: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
e080: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
e090: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
e0a0: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
e0b0: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
e0c0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
e0d0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
e0e0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
e0f0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
e100: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
e110: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
e120: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
e130: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
e140: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
e150: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
e160: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
e170: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
e180: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
e190: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e1a0: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
e1b0: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
e1c0: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
e1d0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
e1e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e1f0: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
e200: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
e210: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
e220: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
e230: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
e240: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
e250: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
e260: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
e270: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
e280: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
e290: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
e2a0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
e2b0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
e2c0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
e2d0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
e2e0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
e2f0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
e300: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
e310: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
e320: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
e330: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
e340: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
e350: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
e360: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
e370: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
e380: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
e3b0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
e3c0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
e3d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e3e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
e3f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e410: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
e420: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
e430: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e450: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
e460: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
e470: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
e480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e490: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
e4a0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
e4b0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
e4e0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
e4f0: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e520: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
e530: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
e540: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
e550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e560: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
e570: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
e580: 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f  pace x;        /
e590: 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20  * Reusable bulk 
e5a0: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73  memory */..  ass
e5b0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
e5c0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
e5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e5e0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
e5f0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
e600: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
e610: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
e620: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
e630: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
e640: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
e650: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
e660: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
e670: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
e680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
e690: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
e6a0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
e6b0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
e6c0: 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75  .  .  /* Each cu
e6d0: 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f  rsor uses a memo
e6e0: 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69  ry cell.  The fi
e6f0: 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73  rst cursor (curs
e700: 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75  or 0) can.  ** u
e710: 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68  se aMem[0] which
e720: 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
e730: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  e used by the VD
e740: 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c  BE program.  All
e750: 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
e760: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
e770: 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72  Mem[] for cursor
e780: 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e  s 1 and greater.
e790: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
e7a0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
e7b0: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
e7c0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20   nCursor;.  if( 
e7d0: 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d  nCursor==0 && nM
e7e0: 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20  em>0 ) nMem++;  
e7f0: 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65  /* Space for aMe
e800: 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74  m[0] even if not
e810: 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46   used */..  /* F
e820: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
e830: 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f  ch reusable memo
e840: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
e850: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e860: 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72  e.  ** opcode ar
e870: 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61  ray.  This extra
e880: 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
e890: 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  reallocated for 
e8a0: 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20  other elements. 
e8b0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61   ** of the prepa
e8c0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
e8d0: 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38   */.  n = ROUND8
e8e0: 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e  (sizeof(Op)*p->n
e8f0: 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  Op);            
e900: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70    /* Bytes of op
e910: 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64  code memory used
e920: 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d   */.  x.pSpace =
e930: 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b   &((u8*)p->aOp)[
e940: 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  n];             
e950: 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f    /* Unused opco
e960: 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  de memory */.  a
e970: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
e980: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53  E_ALIGNMENT(x.pS
e990: 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72  pace) );.  x.nFr
e9a0: 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  ee = ROUNDDOWN8(
e9b0: 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f  pParse->szOpAllo
e9c0: 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65  c - n);  /* Byte
e9d0: 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f  s of unused memo
e9e0: 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ry */.  assert( 
e9f0: 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  x.nFree>=0 );.  
ea00: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
ea10: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e  TE_ALIGNMENT(&x.
ea20: 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29  pSpace[x.nFree])
ea30: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
ea40: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
ea50: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
ea60: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
ea70: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
ea80: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
ea90: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
eaa0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
eab0: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
eac0: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
ead0: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
eae0: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
eaf0: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
eb00: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
eb10: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
eb20: 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77  ted in one or tw
eb30: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
eb40: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
eb50: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
eb60: 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79  se unused memory
eb70: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
eb80: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
eb90: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
eba0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
ebb0: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
ebc0: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
ebd0: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
ebe0: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
ebf0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
ec00: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
ec10: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
ec20: 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20  mainder using a 
ec30: 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c  fresh memory all
ec40: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
ec50: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
ec60: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
ec70: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
ec80: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
ec90: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
eca0: 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79   leftover memory
ecb0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ecc0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
ecd0: 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69    This can signi
ece0: 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
ecf0: 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
ed00: 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
ed10: 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
ed20: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
ed30: 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65  o {.    x.nNeede
ed40: 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  d = 0;.    p->aM
ed50: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
ed60: 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  &x, p->aMem, nMe
ed70: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
ed80: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
ed90: 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
eda0: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
edb0: 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e  f(Mem));.    p->
edc0: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
edd0: 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c  ce(&x, p->apArg,
ede0: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
edf0: 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  *));.    p->apCs
ee00: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
ee10: 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  x, p->apCsr, nCu
ee20: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
ee30: 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
ee40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ee50: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
ee60: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
ee70: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
ee80: 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
ee90: 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
eea0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 78 2e  endif.    if( x.
eeb0: 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20 62 72 65  nNeeded==0 ) bre
eec0: 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61 63 65  ak;.    x.pSpace
eed0: 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71   = p->pFree = sq
eee0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
eef0: 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64  NN(db, x.nNeeded
ef00: 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d  );.    x.nFree =
ef10: 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77   x.nNeeded;.  }w
ef20: 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  hile( !db->mallo
ef30: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
ef40: 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65  >pVList = pParse
ef50: 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72  ->pVList;.  pPar
ef60: 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b  se->pVList =  0;
ef70: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
ef80: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
ef90: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
efa0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
efb0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20  ->nVar = 0;.    
efc0: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a  p->nCursor = 0;.
efd0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b      p->nMem = 0;
efe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
eff0: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
f000: 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20  or;.    p->nVar 
f010: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
f020: 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
f030: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64  p->aVar, nVar, d
f040: 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
f050: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
f060: 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72  ;.    initMemArr
f070: 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ay(p->aMem, nMem
f080: 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69  , db, MEM_Undefi
f090: 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ned);.    memset
f0a0: 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43  (p->apCsr, 0, nC
f0b0: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
f0c0: 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
f0d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f0e0: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
f0f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61  .    memset(p->a
f100: 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70  nExec, 0, p->nOp
f110: 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
f120: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
f130: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
f140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f150: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
f160: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
f170: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
f180: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
f190: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
f1a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f1b0: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
f1c0: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
f1d0: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
f1e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
f1f0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
f200: 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c   pCx->pBtx==0 ||
f210: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d   pCx->eCurType==
f220: 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
f230: 0a 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e  .  switch( pCx->
f240: 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20  eCurType ){.    
f250: 63 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52  case CURTYPE_SOR
f260: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
f270: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
f280: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
f290: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f2a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52    }.    case CUR
f2b0: 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20  TYPE_BTREE: {.  
f2c0: 20 20 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45      if( pCx->isE
f2d0: 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
f2e0: 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74      if( pCx->pBt
f2f0: 78 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65  x ) sqlite3Btree
f300: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29  Close(pCx->pBtx)
f310: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
f320: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
f330: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
f340: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
f350: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
f360: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
f370: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  above. */.      
f380: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
f390: 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70  ssert( pCx->uc.p
f3a0: 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
f3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f3c0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
f3d0: 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
f3e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f3f0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
f400: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f410: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
f420: 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42  ase CURTYPE_VTAB
f430: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f440: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
f450: 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70  VCur = pCx->uc.p
f460: 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73  VCur;.      cons
f470: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
f480: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75   *pModule = pVCu
f490: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
f4a0: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
f4b0: 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
f4c0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  Ref>0 );.      p
f4d0: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
f4e0: 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75  f--;.      pModu
f4f0: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72  le->xClose(pVCur
f500: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f510: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f530: 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74  all cursors in t
f540: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
f550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f560: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
f570: 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  rame(Vdbe *p){. 
f580: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
f590: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
f5a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
f5b0: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
f5c0: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
f5d0: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
f5e0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
f5f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f600: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
f610: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
f620: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
f630: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f640: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  }.}../*.** Copy 
f650: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
f660: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
f670: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
f680: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
f690: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
f6a0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
f6b0: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
f6c0: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
f6d0: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
f6e0: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
f6f0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
f700: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
f710: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
f720: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
f730: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
f740: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
f750: 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64  InFrame(v);.#ifd
f760: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f770: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
f780: 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
f790: 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23  Frame->anExec;.#
f7a0: 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d  endif.  v->aOp =
f7b0: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
f7c0: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
f7d0: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
f7e0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
f7f0: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
f800: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
f810: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
f820: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
f830: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
f840: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
f850: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
f860: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
f870: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
f880: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
f890: 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
f8a0: 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
f8b0: 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ge;.  sqlite3Vdb
f8c0: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 76  eDeleteAuxData(v
f8d0: 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61  ->db, &v->pAuxDa
f8e0: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d  ta, -1, 0);.  v-
f8f0: 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46 72 61  >pAuxData = pFra
f900: 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  me->pAuxData;.  
f910: 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
f920: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
f930: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
f940: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
f950: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
f960: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
f970: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
f980: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
f990: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
f9a0: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
f9b0: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
f9c0: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
f9d0: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
f9e0: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
f9f0: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
fa00: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
fa10: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
fa20: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
fa30: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
fa40: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
fa50: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
fa60: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
fa70: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
fa80: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
fa90: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
faa0: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
fab0: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
fac0: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
fad0: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
fae0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
faf0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
fb00: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
fb10: 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65  0;.    p->nFrame
fb20: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
fb30: 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30  rt( p->nFrame==0
fb40: 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f   );.  closeCurso
fb50: 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20  rsInFrame(p);.  
fb60: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
fb70: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
fb80: 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e  ay(p->aMem, p->n
fb90: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
fba0: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
fbb0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
fbc0: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
fbd0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
fbe0: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
fbf0: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
fc00: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
fc10: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
fc20: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
fc30: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
fc40: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
fc50: 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
fc60: 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
fc70: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
fc80: 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41  ta(p->db, &p->pA
fc90: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
fca0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
fcb0: 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
fcc0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
fcd0: 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e  e VM after a sin
fce0: 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74  gle run..*/.stat
fcf0: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
fd00: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
fd10: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
fd20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fd30: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
fd40: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
fd50: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
fd60: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
fd70: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
fd80: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
fd90: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
fda0: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
fdb0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
fdc0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
fdd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
fde0: 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
fdf0: 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
fe00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
fe10: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
fe20: 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
fe30: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
fe40: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
fe50: 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20  M_Undefined );. 
fe60: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
fe70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
fe80: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
fe90: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
fea0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
feb0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
fec0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
fed0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
fee0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
fef0: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
ff00: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
ff10: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
ff20: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
ff30: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
ff40: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
ff50: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
ff60: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
ff70: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
ff80: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
ff90: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
ffa0: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
ffb0: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
ffc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ffd0: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
ffe0: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
fff0: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
10000 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
10010 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10020 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ->db;..  release
10030 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
10040 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
10050 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
10060 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10070 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
10080 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  ;.  n = nResColu
10090 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
100a0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
100b0 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b  (u16)nResColumn;
100c0 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
100d0 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
100e0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
100f0 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
10100 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
10110 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
10120 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69   ) return;.  ini
10130 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  tMemArray(p->aCo
10140 6c 4e 61 6d 65 2c 20 6e 2c 20 70 2d 3e 64 62 2c  lName, n, p->db,
10150 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f   MEM_Null);.}../
10160 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
10170 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
10180 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
10190 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
101a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
101b0 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
101c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
101d0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
101e0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
101f0 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
10200 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
10210 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
10220 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  mCols()..**.** T
10230 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
10240 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62  er, xDel, must b
10250 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
10260 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f  DYNAMIC, SQLITE_
10270 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c  STATIC.** or SQL
10280 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49  ITE_TRANSIENT. I
10290 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44  f it is SQLITE_D
102a0 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65  YNAMIC, then the
102b0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
102c0 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77  ** to by zName w
102d0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
102e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20  sqlite3DbFree() 
102f0 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
10300 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69   destroyed..*/.i
10310 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
10320 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65  tColName(.  Vdbe
10330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10350 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69  Vdbe being confi
10360 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  gured */.  int i
10370 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
10380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10390 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a  ndex of column z
103a0 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  Name applies to 
103b0 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20  */.  int var,   
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
103e0 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f  the COLNAME_* co
103f0 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  nstants */.  con
10400 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10420 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
10430 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61  er containing na
10440 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  me */.  void (*x
10450 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20  Del)(void*)     
10460 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
10470 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74  ry management st
10480 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65  rategy for zName
10490 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
104a0 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
104b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
104c0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
104d0 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
104e0 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
104f0 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
10500 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
10510 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78  ert( !zName || x
10520 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del!=SQLITE_DYNA
10530 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  MIC );.    retur
10540 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
10550 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
10560 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
10570 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
10580 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
10590 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
105a0 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
105b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
105c0 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
105d0 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
105e0 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
105f0 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
10600 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
10610 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
10620 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
10630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10640 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
10650 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
10660 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
10670 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
10680 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
10690 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
106a0 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
106b0 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
106c0 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
106d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
106e0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
106f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
10700 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10710 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
10720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10730 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
10740 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
10750 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
10760 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
10770 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
10780 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
10790 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
107a0 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
107b0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63     ** that are c
107e0 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20  andidates for a 
107f0 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
10800 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20   using a.       
10810 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
10820 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  aster-journal */
10830 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10840 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
10850 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
10860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10870 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10880 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
10890 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
108a0 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
108b0 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
108c0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
108d0 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
108e0 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
108f0 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
10900 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
10910 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
10920 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
10930 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
10940 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
10950 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
10960 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
10970 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
10980 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
10990 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
109a0 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
109b0 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
109c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
109d0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
109e0 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
109f0 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
10a00 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
10a10 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
10a20 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
10a30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10a40 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
10a50 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
10a60 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
10a70 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
10a80 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
10a90 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
10aa0 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
10ab0 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
10ac0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
10ad0 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
10ae0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
10af0 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
10b00 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
10b10 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
10b20 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
10b30 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
10b40 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
10b50 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
10b60 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
10b70 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
10b80 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
10b90 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
10ba0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
10bb0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
10bc0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10bd0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10be0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10bf0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10c00 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
10c10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ){.      /* Whet
10c20 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74  her or not a dat
10c30 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64  abase might need
10c40 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10c50 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20  l depends upon. 
10c60 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72       ** its jour
10c70 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20  nal mode (among 
10c80 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20  other things).  
10c90 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65  This matrix dete
10ca0 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20  rmines which.   
10cb0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f     ** journal mo
10cc0 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72  des use a master
10cd0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69   journal and whi
10ce0 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20  ch do not */.   
10cf0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
10d00 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d  u8 aMJNeeded[] =
10d10 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45   {.        /* DE
10d20 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20  LETE   */  1,.  
10d30 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54        /* PERSIST
10d40 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20     */ 1,.       
10d50 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f   /* OFF       */
10d60 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   0,.        /* T
10d70 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20  RUNCATE  */ 1,. 
10d80 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59         /* MEMORY
10d90 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
10da0 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a    /* WAL       *
10db0 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  / 0.      };.   
10dc0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
10dd0 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73  ;   /* Pager ass
10de0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74  ociated with pBt
10df0 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63   */.      needXc
10e00 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10e20 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  er(pBt);.      p
10e30 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
10e40 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
10e50 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
10e60 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[i].safety_leve
10e70 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l!=PAGER_SYNCHRO
10e80 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20  NOUS_OFF.       
10e90 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c  && aMJNeeded[sql
10ea0 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72  ite3PagerGetJour
10eb0 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d  nalMode(pPager)]
10ec0 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20  .      ){ .     
10ed0 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20     assert( i!=1 
10ee0 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e  );.        nTran
10ef0 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s++;.      }.   
10f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10f10 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
10f20 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
10f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10f40 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ve(pBt);.    }. 
10f50 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
10f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10f70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10f80 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10f90 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
10fa0 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
10fb0 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
10fc0 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
10fd0 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
10fe0 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
10ff0 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
11000 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
11010 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
11020 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
11030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11040 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11050 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
11060 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
11070 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
11080 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
11090 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
110a0 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
110b0 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
110c0 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
110d0 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
110e0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
110f0 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
11100 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
11110 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
11120 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
11130 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11140 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
11150 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
11160 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
11170 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
11180 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
11190 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
111a0 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
111b0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
111c0 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
111d0 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
111e0 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
111f0 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
11200 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
11210 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
11220 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
11230 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
11240 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
11250 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
11260 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
11270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
11280 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
11290 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
112a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
112b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
112c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
112d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
112e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
112f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11300 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
11310 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
11320 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
11330 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
11340 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
11350 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
11360 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
11370 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
11380 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
11390 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
113a0 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
113b0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
113c0 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
113d0 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
113e0 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
113f0 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
11400 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
11410 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
11420 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
11430 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
11440 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11450 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11460 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11470 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11480 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11490 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
114a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
114b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
114c0 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
114d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
114e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
114f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11500 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
11510 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
11520 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
11530 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
11540 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
11550 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
11560 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
11570 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
11580 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11590 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
115a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
115b0 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
115c0 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  ically..  */.#if
115d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
115e0 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
115f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
11600 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
11610 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
11620 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
11630 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
11640 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
11650 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
11660 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
11670 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11680 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
11690 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
116a0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
116b0 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
116c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
116d0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
116e0 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
116f0 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
11700 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
11710 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11720 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
11730 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
11740 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11750 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
11760 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
11770 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
11780 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
11790 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
117a0 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
117b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
117c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f  MEM_BKPT;.    do
117d0 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
117e0 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
117f0 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
11800 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
11810 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
11820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
11830 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
11840 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
11850 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11860 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
11870 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11880 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
11890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
118a0 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
118b0 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
118c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
118d0 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
118e0 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
118f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11900 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11910 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
11920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
11930 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
11940 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
11950 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
11960 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
11970 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
11980 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
11990 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
119c0 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
119d0 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
119e0 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
119f0 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
11a00 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
11a10 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
11a20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
11a30 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
11a40 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
11a50 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
11a60 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
11a70 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
11a80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
11a90 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
11aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
11ab0 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
11ac0 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
11ad0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11ae0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
11af0 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
11b00 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
11b10 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
11b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11b30 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
11b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11b50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
11b60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11b70 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
11b80 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
11b90 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
11ba0 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
11bb0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
11bc0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11bd0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
11be0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
11bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11c00 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
11c10 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
11c20 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
11c30 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
11c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11c50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11c60 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11c70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11c80 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
11c90 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
11ca0 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
11cb0 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
11cc0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
11cd0 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
11ce0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
11cf0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11d00 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
11d10 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
11d20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11d30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11d40 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
11d50 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
11d60 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
11d70 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
11d80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11d90 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
11da0 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
11db0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
11dc0 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
11dd0 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
11de0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11df0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
11e00 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
11e10 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11e20 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11e30 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
11e40 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
11e50 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
11e60 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
11e70 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
11e80 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
11e90 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
11ea0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
11eb0 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
11ec0 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
11ed0 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
11ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
11ef0 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
11f00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
11f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11f20 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
11f30 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
11f40 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
11f50 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
11f60 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
11f70 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
11f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
11f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11fb0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
11fc0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
11fd0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
11fe0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
11ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12000 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
12010 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
12020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12040 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
12050 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
12060 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
12070 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
12080 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
12090 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
120a0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
120b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
120c0 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  ( 0==(sqlite3OsD
120d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
120e0 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
120f0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
12100 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
12110 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
12120 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
12130 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
12140 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
12150 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12160 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
12170 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
12180 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
12190 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
121a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
121b0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
121c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
121d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
121e0 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
121f0 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
12200 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
12210 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
12220 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
12230 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12240 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
12250 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12260 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
12270 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
12280 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
12290 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
122a0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
122b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
122c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
122d0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
122e0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
122f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12300 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
12310 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
12320 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
12330 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
12340 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
12350 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
12360 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
12370 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
12380 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12390 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
123a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
123b0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
123c0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
123d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
123e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
123f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
12400 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
12410 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12420 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
12430 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12440 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
12450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12460 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12470 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
12480 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
12490 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
124a0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
124b0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
124c0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
124d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
124e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
124f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12500 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12520 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
12530 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
12540 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
12550 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
12560 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
12570 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
12580 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
12590 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
125a0 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
125b0 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
125c0 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
125d0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
125e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
125f0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
12600 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
12610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12620 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
12630 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
12640 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
12670 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
12680 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
12690 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
126a0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
126b0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
126c0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
126d0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
126e0 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
126f0 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
12700 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
12710 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
12720 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
12730 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
12740 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
12750 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
12760 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
12770 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
12780 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
12790 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
127a0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
127b0 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
127c0 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
127d0 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
127e0 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
127f0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
12800 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
12810 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
12820 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
12830 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
12840 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12850 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12860 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
12870 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
12880 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12890 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
128a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
128b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
128c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
128d0 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
128e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
128f0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
12900 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
12910 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
12920 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
12930 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
12940 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
12950 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
12960 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
12970 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
12980 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
12990 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
129a0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
129b0 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
129c0 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
129d0 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
129e0 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
129f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
12a00 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
12a10 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
12a20 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
12a30 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
12a40 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
12a50 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
12a60 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
12a70 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
12a80 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
12a90 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
12aa0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
12ab0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
12ac0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
12ad0 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
12ae0 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
12af0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
12b00 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
12b10 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
12b20 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
12b30 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
12b40 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
12b50 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12b60 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
12b70 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
12b80 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
12b90 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
12ba0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
12bb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
12bc0 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
12bd0 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
12be0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12bf0 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
12c00 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
12c20 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
12c30 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
12c40 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
12c50 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
12c60 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
12c70 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
12c80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
12c90 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
12ca0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
12cb0 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
12cc0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
12cd0 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
12ce0 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
12cf0 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
12d00 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
12d10 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
12d20 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
12d30 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
12d40 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
12d50 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
12d60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
12d70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
12d80 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
12d90 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
12da0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
12db0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
12dc0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
12dd0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
12de0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
12df0 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
12e00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
12e10 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
12e20 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
12e30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
12e40 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65  OINLINE int vdbe
12e50 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
12e60 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
12e70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
12e80 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
12e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12ea0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
12eb0 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
12ec0 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
12ed0 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72  ment-1;..  asser
12ee0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
12ef0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
12f00 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
12f10 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28  EASE);.  assert(
12f20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
12f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12f40 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
12f50 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
12f60 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
12f70 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
12f80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
12f90 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
12fa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65  ITE_OK;.    Btre
12fb0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12fc0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
12fd0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66   pBt ){.      if
12fe0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12ff0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
13000 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
13010 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
13020 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
13030 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
13040 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
13050 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
13060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13070 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13080 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
13090 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
130a0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
130b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
130c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
130d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
130e0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
130f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d  .    }.  }.  db-
13100 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
13110 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
13120 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
13130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13140 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
13150 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13160 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13170 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
13180 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
13190 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
131a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
131b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
131c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
131d0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
131e0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
131f0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
13200 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oint);.    }.  }
13210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
13220 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13230 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
13240 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
13250 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  estore the .  **
13260 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13270 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
13280 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
13290 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
132a0 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65  d when .  ** the
132b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
132c0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
132d0 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70  d.  */.  if( eOp
132e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
132f0 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  BACK ){.    db->
13300 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
13310 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
13320 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
13330 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
13340 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
13350 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13360 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
13370 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
13380 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
13390 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  p){.  if( p->db-
133a0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
133b0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
133c0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
133d0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
133e0 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74   eOp);.  }.  ret
133f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13400 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
13410 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13420 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
13430 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
13440 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
13450 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
13460 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
13470 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
13480 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
13490 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
134a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
134b0 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
134c0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
134d0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
134e0 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
134f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
13500 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
13510 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
13520 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
13530 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
13540 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
13550 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
13560 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
13570 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
13580 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
13590 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
135a0 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
135b0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
135c0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
135d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
135e0 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
135f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
13600 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
13610 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
13620 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
13630 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
13640 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
13650 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
13660 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
13670 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
13680 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
13690 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
136a0 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
136b0 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
136c0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
136d0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
136e0 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
136f0 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
13700 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
13710 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f  VdbeError(p, "FO
13720 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
13730 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
13740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13750 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13770 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13790 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
137a0 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
137b0 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
137c0 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
137d0 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
137e0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
137f0 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
13800 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
13810 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
13820 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
13830 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
13840 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13850 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
13860 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
13870 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
13880 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
13890 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
138a0 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
138b0 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
138c0 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
138d0 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
138e0 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
138f0 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
13900 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
13910 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
13920 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
13930 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
13940 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
13950 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
13960 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
13970 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13980 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
13990 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
139a0 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
139b0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
139c0 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
139d0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
139e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
139f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13a10 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
13a20 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
13a30 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
13a40 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
13a50 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
13a60 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
13a70 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
13a80 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
13a90 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
13aa0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
13ab0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
13ac0 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
13ad0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
13ae0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
13af0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
13b00 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
13b10 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
13b20 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
13b30 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
13b40 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
13b50 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
13b60 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
13b70 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
13b80 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
13b90 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
13ba0 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
13bb0 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
13bc0 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
13bd0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
13be0 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
13bf0 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
13c00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
13c10 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
13c20 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
13c30 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
13c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
13c50 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
13c60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13c70 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
13c80 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
13c90 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
13ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13cb0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
13cc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13cd0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
13ce0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13cf0 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
13d00 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41  ors(p);.  checkA
13d10 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
13d20 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
13d30 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
13d40 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
13d50 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
13d60 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
13d70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
13d80 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
13d90 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
13da0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
13db0 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
13dc0 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
13dd0 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
13de0 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
13df0 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
13e00 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
13e10 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
13e20 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
13e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13e40 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
13e50 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
13e60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
13e70 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
13e80 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
13e90 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
13ea0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
13eb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
13ec0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13ed0 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
13ee0 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
13ef0 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
13f00 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
13f10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
13f20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
13f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f40 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
13f50 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
13f60 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
13f70 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
13f80 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
13f90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
13fa0 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
13fb0 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  y and the error 
13fc0 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49  code is SQLITE_I
13fd0 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20  NTERRUPT, .     
13fe0 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   ** no rollback 
13ff0 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74  is necessary. Ot
14000 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73  herwise, at leas
14010 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  t a savepoint . 
14020 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
14030 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  ion must be roll
14040 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f  ed back to resto
14050 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
14060 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  to a .      ** c
14070 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
14080 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
14090 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73  ** Even if the s
140a0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64  tatement is read
140b0 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70  -only, it is imp
140c0 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72  ortant to perfor
140d0 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61  m.      ** a sta
140e0 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
140f0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f  ction rollback o
14100 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
14110 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a   error .      **
14120 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
14130 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
14140 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
14150 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
14160 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
14170 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
14180 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
14190 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
141a0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
141b0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
141c0 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
141d0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
141e0 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
141f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
14200 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
14210 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
14220 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
14230 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
14240 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
14250 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
14260 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
14270 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
14280 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
14290 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
142a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
142b0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
142c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
142d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
142e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
142f0 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
14300 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
14310 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
14320 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
14330 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
14340 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
14350 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
14360 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
14370 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
14380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14390 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
143a0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
143b0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
143c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
143d0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
143e0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
143f0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14400 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
14410 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
14440 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
14450 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
14460 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
14470 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14490 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
144a0 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
144b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
144c0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
144d0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
144e0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
144f0 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
14500 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
14510 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
14520 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
14530 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
14540 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
14550 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
14560 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
14570 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
14580 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
14590 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
145a0 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
145b0 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
145c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
145d0 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
145e0 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
145f0 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
14600 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
14610 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
14620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
14630 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14640 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
14650 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
14660 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
14670 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
14680 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
14690 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
146a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
146b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
146c0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
146d0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
146e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
146f0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
14700 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14710 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14730 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14740 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
14750 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
14760 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
14770 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
14780 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
14790 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
147a0 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
147b0 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
147c0 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
147d0 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
147e0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
147f0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
14800 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
14810 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
14820 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
14830 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
14840 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
14850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
14860 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
14870 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
14880 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
14890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
148a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
148b0 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
148c0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
148d0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
148e0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
148f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14900 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
14910 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
14920 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
14930 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
14940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14950 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14960 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
14970 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14980 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
14990 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
149a0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
149b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
149c0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
149d0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
149e0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
149f0 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
14a00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14a10 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
14a20 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
14a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
14a40 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14a50 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
14a60 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
14a70 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14a80 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14a90 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
14aa0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
14ab0 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
14ac0 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
14ad0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14ae0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
14af0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
14b00 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
14b10 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
14b20 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
14b30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
14b40 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14b50 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
14b60 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
14b70 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14b80 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
14b90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14ba0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14bb0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14bc0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14bd0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14be0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14bf0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14c00 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
14c10 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14c30 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
14c40 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
14c50 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
14c60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14c70 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
14c80 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
14c90 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
14ca0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
14cb0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
14cc0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
14cd0 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
14ce0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
14cf0 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
14d00 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
14d10 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
14d20 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
14d30 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14d40 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
14d50 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
14d60 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
14d70 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
14d80 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
14d90 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
14da0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
14db0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
14dc0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
14dd0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14de0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
14df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14e00 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
14e10 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
14e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14e30 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
14e40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14e50 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
14e70 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
14e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
14e90 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14ea0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
14eb0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
14ec0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
14ed0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
14ee0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
14ef0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
14f00 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14f10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14f20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
14f30 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
14f40 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
14f50 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
14f60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14f70 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
14f80 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
14f90 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
14fa0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
14fb0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
14fc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
14fd0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
14fe0 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
14ff0 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
15000 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
15010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15020 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
15030 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
15040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15050 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
15060 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
15070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
15080 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15090 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
150a0 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
150b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
150c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
150d0 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
150e0 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
150f0 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
15100 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
15110 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
15120 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
15130 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
15140 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
15150 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
15160 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
15170 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
15180 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
15190 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
151a0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
151b0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
151c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
151d0 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
151e0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
151f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
15200 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
15210 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
15220 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
15230 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
15240 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
15250 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15260 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
15270 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
15280 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
15290 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
152a0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
152b0 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
152c0 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
152d0 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
152e0 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
152f0 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
15300 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
15310 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
15320 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
15330 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
15340 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
15350 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
15360 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
15370 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
15380 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
15390 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
153a0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
153b0 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d  eActive>0 || db-
153c0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
153d0 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  | db->nStatement
153e0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
153f0 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42  (p->rc==SQLITE_B
15400 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  USY ? SQLITE_BUS
15410 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  Y : SQLITE_OK);.
15420 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
15430 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
15440 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
15450 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
15460 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
15470 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
15480 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
15490 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
154a0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
154b0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
154c0 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
154d0 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
154e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
154f0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65  /*.** Copy the e
15500 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
15510 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f  ror message belo
15520 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42  nging to the VDB
15530 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  E passed.** as t
15540 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15550 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73  t to its databas
15560 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61  e handle (so tha
15570 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a  t they will be .
15580 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63  ** returned by c
15590 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
155a0 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71  errcode() and sq
155b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e  lite3_errmsg()).
155c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
155d0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c  tion does not cl
155e0 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72  ear the VDBE err
155f0 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61  or code or messa
15600 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69  ge, just.** copi
15610 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64  es them to the d
15620 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
15630 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15640 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
15650 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
15660 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
15670 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
15680 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  c;.  if( p->zErr
15690 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62  Msg ){.    db->b
156a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a  BenignMalloc++;.
156b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
156c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
156d0 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72      if( db->pErr
156e0 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d  ==0 ) db->pErr =
156f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
15700 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
15710 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
15720 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
15730 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
15740 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
15750 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
15760 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
15770 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65  c();.    db->bBe
15780 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20  nignMalloc--;.  
15790 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
157a0 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rc;.  }else{.   
157b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
157c0 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rc);.  }.  ret
157d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
157e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
157f0 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20  SQLLOG./*.** If 
15800 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  an SQLITE_CONFIG
15810 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20  _SQLLOG hook is 
15820 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74  registered and t
15830 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72  he VM has been r
15840 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69  un, .** invoke i
15850 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
15860 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  d vdbeInvokeSqll
15870 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69  og(Vdbe *v){.  i
15880 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
15890 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26  Config.xSqllog &
158a0 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & v->rc==SQLITE_
158b0 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26  OK && v->zSql &&
158c0 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   v->pc>=0 ){.   
158d0 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64   char *zExpanded
158e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
158f0 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53  pandSql(v, v->zS
15900 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ql);.    assert(
15910 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73   v->db->init.bus
15920 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
15930 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20  zExpanded ){.   
15940 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
15950 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a  Config.xSqllog(.
15960 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15970 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
15980 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c  qllogArg, v->db,
15990 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20   zExpanded, 1.  
159a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
159b0 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
159c0 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20  , zExpanded);.  
159d0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
159e0 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76  # define vdbeInv
159f0 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e  okeSqllog(x).#en
15a00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  dif../*.** Clean
15a10 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
15a20 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
15a30 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
15a40 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
15a50 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
15a60 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
15a70 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
15a80 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
15a90 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
15aa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15ab0 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
15ac0 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
15ad0 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
15ae0 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
15af0 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
15b00 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
15b10 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
15b20 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
15b30 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
15b40 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
15b50 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
15b60 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
15b70 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
15b80 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
15b90 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
15ba0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
15bb0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
15bc0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
15bd0 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
15be0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
15bf0 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
15c00 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
15c10 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
15c20 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
15c30 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
15c40 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
15c50 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
15c60 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
15c70 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
15c80 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
15c90 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
15ca0 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
15cb0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
15cc0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
15cd0 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
15ce0 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
15cf0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
15d00 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
15d10 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
15d20 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
15d30 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
15d40 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
15d50 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
15d60 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
15d70 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15d80 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
15d90 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
15da0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
15db0 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f   ){.    vdbeInvo
15dc0 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20  keSqllog(p);.   
15dd0 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
15de0 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20  sferError(p);.  
15df0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15e00 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
15e10 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
15e20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
15e30 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
15e40 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
15e50 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
15e60 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
15e70 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
15e80 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
15e90 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
15ea0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
15eb0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
15ec0 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
15ed0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
15ee0 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
15ef0 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
15f00 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
15f10 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
15f20 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
15f30 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
15f40 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
15f50 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  sg(db, p->rc, p-
15f60 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
15f70 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
15f80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
15f90 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
15fa0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
15fb0 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
15fc0 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
15fd0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
15fe0 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
15ff0 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
16000 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
16010 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
16020 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
16030 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
16040 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
16050 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
16060 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
16070 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
16080 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
16090 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
160a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
160b0 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
160c0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
160d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
160e0 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
160f0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
16100 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16110 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
16120 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
16130 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
16140 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
16150 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
16160 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
16170 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
16180 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
16190 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
161a0 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
161b0 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
161c0 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
161d0 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
161e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
161f0 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
16200 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
16210 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
16220 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
16230 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16240 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
16250 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
16260 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
16270 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
16280 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
16290 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
162a0 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
162b0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
162c0 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
162d0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
162e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
162f0 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
16300 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
16310 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
16320 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
16330 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16340 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
16350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16360 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
16370 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
16380 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
16390 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
163a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
163b0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
163c0 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72  C_RESET;.  retur
163d0 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
163e0 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
163f0 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
16400 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
16410 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
16420 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
16430 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
16440 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
16450 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
16460 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
16470 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
16480 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
16490 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
164a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
164b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
164c0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
164d0 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
164e0 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
164f0 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
16500 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
16510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
16520 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
16530 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
16540 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
16550 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
16560 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
16570 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
16580 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
16590 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
165a0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
165b0 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
165c0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
165d0 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
165e0 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
165f0 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
16600 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
16610 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
16620 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
16630 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
16640 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
16650 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
16660 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
16670 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
16680 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
16690 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
166a0 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
166b0 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
166c0 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
166d0 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
166e0 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
166f0 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
16700 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
16710 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
16720 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
16730 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
16740 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
16750 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
16760 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
16770 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
16780 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
16790 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
167a0 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
167b0 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
167c0 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
167d0 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
167e0 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
167f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
16800 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
16810 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75  (sqlite3 *db, Au
16820 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20  xData **pp, int 
16830 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  iOp, int mask){.
16840 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
16850 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
16860 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
16870 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
16880 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d   (pAux->iAuxOp==
16890 69 4f 70 20 0a 20 20 20 20 20 20 20 20 20 20 26  iOp .          &
168a0 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67  & (pAux->iAuxArg
168b0 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
168c0 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
168d0 69 41 75 78 41 72 67 29 29 29 29 0a 20 20 20 20  iAuxArg)))).    
168e0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
168f0 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67  e( pAux->iAuxArg
16900 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==31 );.      if
16910 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41  ( pAux->xDeleteA
16920 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  ux ){.        pA
16930 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70  ux->xDeleteAux(p
16940 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
16950 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
16960 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a  pAux->pNextAux;.
16970 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
16980 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20  ree(db, pAux);. 
16990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
169a0 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
169b0 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Aux;.    }.  }.}
169c0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
169d0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
169e0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
169f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
16a00 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
16a10 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
16a20 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
16a30 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
16a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
16a50 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
16a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
16a70 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16a80 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
16a90 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
16aa0 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
16ab0 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
16ac0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
16ad0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
16ae0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16af0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
16b00 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
16b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16b20 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
16b30 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
16b40 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
16b50 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
16b60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
16b70 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
16b80 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
16b90 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
16ba0 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
16bb0 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
16bc0 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
16bd0 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
16be0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
16bf0 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
16c00 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
16c10 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
16c20 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
16c30 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16c40 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
16c50 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
16c60 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
16c70 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
16c80 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
16c90 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73   p->nVar);.    s
16ca0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16cb0 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20   p->pVList);.   
16cc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16cd0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20  b, p->pFree);.  
16ce0 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  }.  vdbeFreeOpAr
16cf0 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
16d00 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
16d10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16d20 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
16d30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16d40 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20  ->zSql);.#ifdef 
16d50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16d60 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
16d70 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
16d80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
16d90 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Scan; i++){.    
16da0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16db0 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e  db, p->aScan[i].
16dc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
16dd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16de0 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20  db, p->aScan);. 
16df0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
16e00 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16e10 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16e20 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16e30 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16e40 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16e50 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16e60 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16e70 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16e80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16e90 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
16ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16eb0 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
16ec0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
16ed0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
16ee0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16ef0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16f00 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16f10 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16f20 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16f30 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16f40 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16f50 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16f60 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16f70 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16f80 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
16f90 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
16fa0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
16fb0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
16fc0 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
16fd0 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
16fe0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
16ff0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
17000 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
17010 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
17020 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
17030 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
17040 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
17050 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
17060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17070 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
17080 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
17090 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
170a0 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
170b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
170c0 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
170d0 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
170e0 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
170f0 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
17100 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
17110 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
17120 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
17130 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
17140 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
17150 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17160 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
17170 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  p->uc.pCursor, 0
17180 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
17190 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  t, 0, &res);.  i
171a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
171b0 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  c;.  if( res!=0 
171c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
171d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
171e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
171f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
17200 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
17210 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
17220 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
17230 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
17240 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
17250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17260 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
17270 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
17280 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
17290 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
172a0 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
172b0 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
172c0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
172d0 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
172e0 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
172f0 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
17300 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
17310 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
17320 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
17330 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
17340 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
17350 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
17360 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
17370 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
17380 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
17390 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
173a0 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
173b0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
173c0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
173d0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
173e0 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
173f0 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
17400 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
17410 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
17420 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
17430 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
17440 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
17450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
17460 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
17470 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
17480 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
17490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
174a0 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63  sorRestore(p->uc
174b0 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66  .pCursor, &isDif
174c0 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d  ferentRow);.  p-
174d0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
174e0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
174f0 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  ( isDifferentRow
17500 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20   ) p->nullRow = 
17510 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
17520 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
17530 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
17540 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
17550 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20  d.  Restore the 
17560 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65  cursor.** if nee
17570 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e  d be.  Return an
17580 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d  y I/O error from
17590 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65   the restore ope
175a0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
175b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
175c0 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73  Restore(VdbeCurs
175d0 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  or *p){.  assert
175e0 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
175f0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
17600 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
17610 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
17620 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
17630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
17640 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
17650 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
17660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17670 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
17680 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
17690 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
176a0 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
176b0 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
176c0 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
176d0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
176e0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
176f0 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
17700 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
17710 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
17720 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
17730 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
17740 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
17750 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
17760 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
17770 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
17780 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
17790 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
177a0 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
177b0 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
177c0 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
177d0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
177e0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
177f0 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
17800 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
17810 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
17820 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
17830 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
17840 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
17850 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
17860 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
17870 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
17880 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
17890 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
178a0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
178b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
178c0 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
178d0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
178e0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
178f0 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c  **pp, int *piCol
17900 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  ){.  VdbeCursor 
17910 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20  *p = *pp;.  if( 
17920 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
17930 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20  TYPE_BTREE ){.  
17940 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
17950 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20  dMoveto ){.     
17960 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 20   int iMap;.     
17970 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20   if( p->aAltMap 
17980 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41  && (iMap = p->aA
17990 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29  ltMap[1+*piCol])
179a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
179b0 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f  p = p->pAltCurso
179c0 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  r;.        *piCo
179d0 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20  l = iMap - 1;.  
179e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
179f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
17a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e        return han
17a10 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
17a20 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o(p);.    }.    
17a30 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
17a40 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
17a50 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
17a60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61  .      return ha
17a70 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
17a80 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
17a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
17ab0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
17ac0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
17ad0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
17ae0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17af0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
17b00 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
17b10 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
17b20 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
17b30 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
17b40 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
17b50 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
17b60 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
17b70 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
17b80 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
17b90 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
17ba0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
17bb0 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
17bc0 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
17bd0 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
17be0 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
17bf0 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
17c00 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
17c10 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
17c20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
17c30 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
17c40 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
17c50 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
17c60 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
17c70 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
17c80 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
17c90 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
17ca0 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
17cb0 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
17cc0 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
17cd0 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
17ce0 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
17cf0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
17d00 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
17d10 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
17d20 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
17d30 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
17d40 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
17d50 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
17d60 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
17d70 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
17d80 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
17d90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
17da0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
17db0 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
17dc0 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
17dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
17de0 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
17df0 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
17e00 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
17e10 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
17e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
17e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
17e40 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
17e60 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
17e70 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
17e90 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17ea0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17eb0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
17ec0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
17ed0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17ee0 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
17f10 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17f20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
17f30 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
17f40 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17f50 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17f60 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
17f70 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
17f80 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17f90 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
17fc0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17fd0 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
17fe0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
17ff0 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
18000 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
18030 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
18040 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
18060 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
18070 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
18080 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
180b0 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
180c0 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
180d0 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
180e0 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
180f0 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
18100 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
18110 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
18120 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
18130 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
18140 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
18150 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
18160 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
18170 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
18180 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
18190 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
181a0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
181b0 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
181c0 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
181d0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
181e0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
181f0 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
18200 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
18210 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
18220 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
18230 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
18240 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
18250 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
18260 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
18270 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
18280 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
18290 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
182a0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
182b0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
182c0 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
182d0 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
182e0 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
182f0 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
18300 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
18310 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
18320 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
18330 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
18340 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
18350 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
18360 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
18370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18380 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
18390 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
183a0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
183b0 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
183c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
183d0 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
183e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
183f0 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
18400 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
18410 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18420 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
18430 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
18440 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
18450 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
18460 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
18470 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
18480 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
18490 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
184a0 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
184b0 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
184c0 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
184d0 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
184e0 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
184f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
18500 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
18510 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
18520 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
18530 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
18540 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18550 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
18560 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
18570 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
18580 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
18590 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
185a0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
185b0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
185c0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
185d0 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
185e0 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
185f0 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
18600 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
18610 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
18620 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
18630 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
18640 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
18650 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
18660 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
18670 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
18680 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
18690 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
186a0 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
186b0 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
186c0 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
186d0 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
186e0 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
186f0 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
18700 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
18710 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
18720 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
18730 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
18740 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
18750 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
18760 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
18770 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
18780 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
18790 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
187a0 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
187b0 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
187c0 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
187d0 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
187e0 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
187f0 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
18800 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
18810 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
18820 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
18830 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
18840 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
18850 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
18860 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
18870 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
18880 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
18890 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
188a0 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
188b0 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
188c0 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
188d0 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
188e0 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
188f0 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
18900 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
18910 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
18920 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
18930 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
18940 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
18950 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
18960 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
18970 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
18980 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
18990 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
189a0 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
189b0 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
189c0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
189d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
189e0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
189f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
18a00 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
18a10 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
18a20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
18a30 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
18a40 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
18a50 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
18a60 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
18a70 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
18a80 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
18a90 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
18aa0 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
18ab0 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
18ac0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
18ad0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
18ae0 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
18af0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18b00 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
18b10 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
18b20 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
18b30 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
18b40 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
18b50 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
18b60 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
18b70 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
18b80 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
18b90 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
18ba0 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
18bb0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
18bc0 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
18bd0 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
18be0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
18bf0 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
18c00 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
18c10 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
18c20 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
18c30 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
18c40 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
18c50 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
18c60 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
18c70 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
18c80 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
18c90 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
18ca0 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
18cb0 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
18cc0 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
18cd0 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
18ce0 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
18cf0 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
18d00 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
18d10 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
18d20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
18d30 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
18d40 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
18d50 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
18d60 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
18d70 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
18d80 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
18d90 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
18da0 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
18db0 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
18dc0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
18dd0 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
18de0 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
18df0 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
18e00 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
18e10 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
18e20 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
18e30 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
18e40 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
18e50 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
18e60 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
18e70 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
18e80 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
18e90 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
18ea0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18eb0 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
18ec0 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
18ed0 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
18ee0 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
18ef0 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
18f00 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
18f10 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
18f20 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
18f30 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
18f40 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
18f50 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
18f60 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
18f70 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
18f80 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
18f90 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
18fa0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
18fb0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
18fc0 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
18fd0 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
18fe0 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
18ff0 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
19000 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
19010 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
19020 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
19030 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
19040 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
19050 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
19060 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
19070 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
19080 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
19090 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
190a0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
190b0 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
190c0 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
190d0 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
190e0 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
190f0 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
19100 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
19110 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
19120 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
19130 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
19140 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
19150 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
19160 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
19170 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
19180 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
19190 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
191a0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
191b0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
191c0 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
191d0 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
191e0 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
191f0 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
19200 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
19210 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
19220 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
19230 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
19240 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
19250 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
19260 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
19270 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
19280 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
19290 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
192a0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
192b0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
192c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
192d0 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
192e0 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
192f0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
19300 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
19310 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
19320 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
19330 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
19340 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
19350 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
19360 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19370 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
19380 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
19390 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
193a0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
193b0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
193c0 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
193d0 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
193e0 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
193f0 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
19400 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
19410 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
19420 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
19430 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
19440 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
19450 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19460 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
19470 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
19480 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
19490 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
194a0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
194b0 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
194c0 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
194d0 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
194e0 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
194f0 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
19500 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
19510 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
19520 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
19530 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
19540 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
19550 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
19560 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
19570 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
19580 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
19590 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
195a0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
195b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
195c0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
195d0 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
195e0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
195f0 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
19600 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
19610 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
19620 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
19630 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
19640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
19650 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
19660 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
19670 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
19680 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
19690 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
196a0 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
196b0 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
196c0 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
196d0 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
196e0 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
196f0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
19700 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
19710 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
19720 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
19730 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19740 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
19750 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
19760 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
19770 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
19780 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
19790 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
197a0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
197b0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
197c0 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
197d0 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
197e0 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
197f0 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
19800 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
19810 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
19820 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
19830 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
19840 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
19850 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
19860 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
19870 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
19880 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
19890 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
198a0 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
198b0 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
198c0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
198d0 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
198e0 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
198f0 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
19900 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
19910 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
19920 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
19930 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
19940 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
19950 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
19960 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
19970 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
19980 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
19990 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
199a0 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
199b0 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
199c0 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
199d0 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
199e0 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
199f0 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
19a00 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
19a10 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
19a20 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
19a30 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
19a40 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
19a50 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
19a60 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
19a70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19a80 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
19a90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19aa0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
19ab0 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
19ac0 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
19ad0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
19ae0 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
19af0 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
19b00 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
19b10 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
19b20 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
19b30 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
19b40 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
19b50 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
19b60 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
19b70 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
19b80 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
19b90 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
19ba0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
19bb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
19bc0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
19bd0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19be0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
19bf0 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
19c00 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
19c10 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
19c20 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
19c30 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
19c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
19c50 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
19c60 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
19c70 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
19c80 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
19c90 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
19ca0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
19cb0 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
19cc0 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
19cd0 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
19ce0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19cf0 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
19d00 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19d10 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
19d20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
19d30 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
19d40 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
19d50 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
19d60 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19d70 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
19d80 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19d90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19da0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19db0 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
19dc0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19dd0 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
19de0 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
19df0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
19e00 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
19e10 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
19e20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
19e30 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
19e40 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
19e50 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
19e60 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
19e70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
19e80 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
19e90 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
19ea0 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
19eb0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
19ec0 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
19ed0 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
19ee0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
19ef0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
19f00 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
19f10 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
19f20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
19f30 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
19f40 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
19f50 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
19f60 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
19f70 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
19f80 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
19f90 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19fa0 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
19fb0 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
19fc0 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
19fd0 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
19fe0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
19ff0 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1a000 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1a010 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1a020 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1a030 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1a040 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1a050 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1a060 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1a070 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a080 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1a090 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1a0a0 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1a0b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1a0c0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1a0d0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1a0e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a0f0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1a100 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1a110 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1a120 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a140 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1a150 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1a160 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a180 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1a190 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1a1a0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1a1b0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1a1c0 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
1a1d0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
1a1e0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
1a1f0 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
1a200 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
1a210 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
1a220 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20  e 0: {  /* Null 
1a230 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a240 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38  ENCE-OF: R-24078
1a250 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20  -09375 Value is 
1a260 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20  a NULL. */.     
1a270 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1a280 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
1a290 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a2a0 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20  case 1: {.      
1a2b0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a2c0 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61  R-44885-25196 Va
1a2d0 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20  lue is an 8-bit 
1a2e0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a  twos-complement.
1a2f0 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
1a300 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a310 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f  >u.i = ONE_BYTE_
1a320 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a330 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a340 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a350 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a360 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a370 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1a380 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
1a390 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a3a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1a3b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
1a3c0 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20  794-35026 Value 
1a3d0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1a3e0 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  16-bit.      ** 
1a3f0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1a400 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1a410 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57    pMem->u.i = TW
1a420 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1a430 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1a440 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1a450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1a460 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1a470 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
1a480 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
1a490 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
1a4a0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1a4b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a4c0 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31  F: R-37839-54301
1a4d0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1a4e0 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20  endian 24-bit.  
1a4f0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1a500 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1a510 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a520 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  .i = THREE_BYTE_
1a530 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a540 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a550 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a560 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a570 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a580 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
1a590 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
1a5a0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a5b0 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1a5c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
1a5d0 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20  849-26079 Value 
1a5e0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1a5f0 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  32-bit.      ** 
1a600 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1a610 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1a620 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
1a630 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  UR_BYTE_INT(buf)
1a640 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63  ;.#ifdef __HP_cc
1a650 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20   .      /* Work 
1a660 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78  around a sign-ex
1a670 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74  tension bug in t
1a680 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66  he HP compiler f
1a690 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20  or HP/UX */.    
1a6a0 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38    if( buf[0]&0x8
1a6b0 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d  0 ) pMem->u.i |=
1a6c0 20 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30   0xffffffff80000
1a6d0 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  000LL;.#endif.  
1a6e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a6f0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a700 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a710 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a720 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
1a730 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1a740 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1a750 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1a760 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a770 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61  R-50385-09674 Va
1a780 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a790 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20  ian 48-bit.     
1a7a0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1a7b0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1a7c0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a7d0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1a7e0 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34  (buf+2) + (((i64
1a7f0 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1a800 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a810 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a820 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a830 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a840 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a850 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
1a860 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
1a870 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a880 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
1a890 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
1a8a0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
1a8b0 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75        /* These u
1a8c0 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  se local variabl
1a8d0 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69  es, so do them i
1a8e0 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  n a separate rou
1a8f0 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  tine.      ** to
1a900 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
1a910 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20   move the frame 
1a920 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
1a930 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
1a940 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61      return seria
1a950 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f  lGet(buf,serial_
1a960 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20  type,pMem);.    
1a970 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
1a980 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
1a990 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
1a9a0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
1a9b0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a9c0 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32  E-OF: R-12976-22
1a9d0 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65  893 Value is the
1a9e0 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20   integer 0. */. 
1a9f0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1aa00 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31  -OF: R-18143-121
1aa10 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  21 Value is the 
1aa20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20  integer 1. */.  
1aa30 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1aa40 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
1aa50 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1aa60 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1aa70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1aa80 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1aa90 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1aaa0 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33  CE-OF: R-14606-3
1aab0 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20  1564 Value is a 
1aac0 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d  BLOB that is (N-
1aad0 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20  12)/2 bytes in. 
1aae0 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a       ** length..
1aaf0 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
1ab00 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30  E-OF: R-28401-00
1ab10 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73  140 Value is a s
1ab20 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78  tring in the tex
1ab30 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20  t encoding and. 
1ab40 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32       ** (N-13)/2
1ab50 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
1ab60 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  . */.      stati
1ab70 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
1ab80 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
1ab90 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
1aba0 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
1abb0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
1abc0 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
1abd0 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
1abe0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
1abf0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1ac00 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
1ac10 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
1ac20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
1ac30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ac40 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
1ac50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ac60 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
1ac70 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1ac80 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
1ac90 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
1aca0 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
1acb0 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
1acc0 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
1acd0 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
1ace0 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
1acf0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1ad00 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
1ad10 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
1ad20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
1ad30 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
1ad40 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
1ad50 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
1ad60 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
1ad70 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
1ad80 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
1ad90 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
1ada0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
1adb0 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
1adc0 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
1add0 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
1ade0 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
1adf0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
1ae00 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1ae10 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
1ae20 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
1ae30 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
1ae40 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
1ae50 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
1ae60 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
1ae70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
1ae80 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
1ae90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1aea0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1aeb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
1aec0 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
1aed0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1aee0 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
1aef0 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
1af00 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
1af10 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
1af20 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20  pKeyInfo        
1af30 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
1af40 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
1af50 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61  ord */.){.  Unpa
1af60 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20  ckedRecord *p;  
1af70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1af80 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
1af90 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
1afa0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1afc0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1afd0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
1afe0 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   */.  nByte = RO
1aff0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1b000 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
1b010 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
1b020 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
1b030 0a 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64  .  p = (Unpacked
1b040 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33  Record *)sqlite3
1b050 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
1b060 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
1b070 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1b080 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d  urn 0;.  p->aMem
1b090 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
1b0a0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
1b0b0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1b0c0 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
1b0d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1b0e0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
1b0f0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1b100 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
1b110 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
1b120 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1b130 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1b140 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1b150 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1b160 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1b170 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1b180 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1b190 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1b1a0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1b1b0 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1b1c0 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1b1d0 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1b1e0 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1b1f0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1b200 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1b210 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1b220 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1b230 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1b240 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1b250 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1b260 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b270 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1b280 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1b290 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1b2a0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1b2b0 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1b2c0 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1b2d0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1b2e0 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1b2f0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1b300 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1b310 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1b320 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1b330 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1b340 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
1b350 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1b360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1b370 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1b380 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1b390 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3b0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b3c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1b3d0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1b3e0 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1b3f0 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1b400 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1b410 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1b420 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1b430 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1b440 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1b450 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1b460 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1b470 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1b480 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
1b490 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1b4a0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1b4b0 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
1b4c0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1b4d0 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
1b4e0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1b4f0 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
1b500 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
1b510 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
1b520 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
1b530 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
1b540 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
1b550 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
1b560 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
1b570 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
1b580 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1b590 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1b5a0 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1b5b0 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1b5c0 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1b5d0 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1b5e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
1b5f0 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1b600 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
1b610 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1b620 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1b630 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
1b640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1b650 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
1b660 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
1b670 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
1b680 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
1b690 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b6a0 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
1b6b0 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
1b6c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
1b6d0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1b6e0 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
1b6f0 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
1b700 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
1b710 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b720 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
1b730 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
1b740 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
1b750 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
1b760 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
1b770 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1b780 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
1b790 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
1b7a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1b7b0 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
1b7c0 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
1b7d0 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
1b7e0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b7f0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
1b800 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
1b810 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
1b820 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
1b830 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
1b840 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
1b850 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1b860 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1b870 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
1b880 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1b890 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1b8a0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
1b8b0 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
1b8c0 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
1b8d0 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1b8e0 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
1b8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1b900 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
1b910 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1b920 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b930 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1b940 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1b950 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
1b960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b970 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b980 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
1b990 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1b9a0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
1b9b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1b9c0 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
1b9d0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
1b9e0 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
1b9f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ba00 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1ba10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1ba20 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
1ba30 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
1ba40 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
1ba50 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1ba60 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
1ba70 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
1ba80 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
1ba90 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1baa0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
1bab0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1bac0 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
1bad0 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
1bae0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1baf0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1bb00 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
1bb10 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1bb20 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1bb30 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1bb40 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1bb50 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
1bb60 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
1bb70 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
1bb80 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
1bb90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1bba0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
1bbb0 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
1bbc0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
1bbd0 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
1bbe0 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
1bbf0 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
1bc00 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
1bc10 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
1bc20 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
1bc30 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
1bc40 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
1bc50 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
1bc60 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
1bc70 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
1bc80 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
1bc90 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
1bca0 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
1bcb0 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
1bcc0 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
1bcd0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
1bce0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
1bcf0 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
1bd00 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
1bd10 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
1bd20 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
1bd30 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
1bd40 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
1bd50 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1bd60 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
1bd70 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1bd80 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
1bd90 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
1bda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1bdb0 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
1bdc0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
1bdd0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1bde0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1bdf0 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1be00 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
1be10 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1be20 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1be30 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1be40 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1be50 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1be60 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1be70 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1be80 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1be90 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
1bea0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
1beb0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
1bec0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
1bed0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
1bee0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
1bef0 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
1bf00 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
1bf10 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
1bf20 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
1bf30 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
1bf40 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
1bf50 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
1bf60 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
1bf70 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
1bf80 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
1bf90 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
1bfa0 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
1bfb0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1bfc0 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
1bfd0 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
1bfe0 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
1bff0 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
1c000 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
1c010 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
1c020 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
1c030 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1c040 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
1c050 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
1c060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c070 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1c080 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
1c090 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
1c0a0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1c0b0 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1c0c0 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
1c0d0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1c0e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1c0f0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1c100 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1c110 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1c120 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1c130 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1c140 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1c150 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1c160 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1c170 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1c180 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1c190 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1c1a0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
1c1b0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
1c1c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
1c1d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c1e0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1c1f0 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1c200 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1c210 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1c220 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1c230 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c240 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
1c250 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
1c260 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
1c270 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1c280 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
1c290 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
1c2a0 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
1c2b0 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
1c2c0 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1c2d0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1c2e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1c2f0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1c300 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1c310 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1c320 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1c330 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1c340 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1c350 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1c360 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1c370 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1c380 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1c390 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
1c3a0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1c3b0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1c3c0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1c3d0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1c3e0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1c3f0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1c400 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1c410 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1c420 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1c430 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1c440 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1c450 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
1c460 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1c470 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
1c480 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
1c490 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
1c4a0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
1c4b0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1c4c0 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
1c4d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c4e0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
1c4f0 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
1c500 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
1c510 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
1c520 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1c530 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c540 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1c550 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c560 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1c570 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
1c580 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1c590 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
1c5a0 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
1c5b0 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
1c5c0 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
1c5d0 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
1c5e0 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
1c5f0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1c600 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
1c610 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
1c620 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b  nfo->nField + pK
1c630 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e  eyInfo->nXField.
1c640 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
1c650 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
1c660 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
1c670 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
1c680 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
1c690 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1c6a0 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
1c6b0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1c6c0 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
1c6d0 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
1c6e0 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
1c6f0 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
1c700 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
1c710 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
1c720 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  e KeyInfo.nField
1c730 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   or KeyInfo.nXFi
1c740 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1c750 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1c760 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1c770 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1c780 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1c790 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1c7a0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1c7b0 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1c7c0 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1c7d0 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1c7e0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1c7f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1c800 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1c810 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1c820 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1c830 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1c840 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1c850 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1c860 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1c870 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1c880 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1c890 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1c8a0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1c8b0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1c8c0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1c8d0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1c8e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1c8f0 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1c900 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1c910 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1c920 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1c930 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1c940 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1c950 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1c960 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1c970 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1c980 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d  fo->nXField );.}
1c990 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c9a0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c9b0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c9c0 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1c9d0 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1c9e0 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1c9f0 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1ca00 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1ca10 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1ca20 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1ca30 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1ca40 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1ca50 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1ca60 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1ca70 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1ca80 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1ca90 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1caa0 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1cab0 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1cac0 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1cad0 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1cae0 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1caf0 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1cb00 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1cb10 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1cb20 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1cb30 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1cb40 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1cb50 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1cb60 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb80 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1cb90 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1cba0 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1cbb0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1cbc0 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1cbd0 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1cbe0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1cbf0 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1cc00 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1cc10 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1cc20 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1cc30 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1cc40 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1cc50 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1cc60 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1cc70 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1cc80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1cc90 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1cca0 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1ccb0 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20    int n1, n2;.  
1ccc0 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1ccd0 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1cce0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1ccf0 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1cd00 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1cd10 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1cd20 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1cd30 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1cd40 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1cd50 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1cd60 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1cd70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1cd80 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1cd90 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1cda0 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1cdb0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1cdc0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1cdd0 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1cde0 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30  ;.    n1 = v1==0
1cdf0 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20   ? 0 : c1.n;.   
1ce00 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v2 = sqlite3Val
1ce10 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1ce20 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c  value*)&c2, pCol
1ce30 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20  l->enc);.    n2 
1ce40 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32  = v2==0 ? 0 : c2
1ce50 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f  .n;.    rc = pCo
1ce60 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1ce70 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e  pUser, n1, v1, n
1ce80 32 2c 20 76 32 29 3b 0a 20 20 20 20 69 66 28 20  2, v2);.    if( 
1ce90 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1cea0 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70 72   && prcErr ) *pr
1ceb0 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1cec0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
1ced0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1cee0 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1cef0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1cf00 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
1cf10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1cf20 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
1cf30 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74  pBlob is guarant
1cf40 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62  eed to be a Blob
1cf50 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72   that is not mar
1cf60 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f  ked.** with MEM_
1cf70 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72  Zero.  Return tr
1cf80 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62  ue if it could b
1cf90 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a  e a zero-blob..*
1cfa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
1cfb0 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61  llZero(const cha
1cfc0 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
1cfd0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1cfe0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1cff0 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75   if( z[i] ) retu
1d000 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1d010 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1d020 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1d030 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1d040 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1d050 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1d060 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1d070 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1d080 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1d090 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1d0a0 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1d0b0 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1d0c0 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1d0d0 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1d0e0 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1d0f0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1d100 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73  E_NOINLINE int s
1d110 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1d120 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31  e(const Mem *pB1
1d130 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32  , const Mem *pB2
1d140 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1d150 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20  t n1 = pB1->n;. 
1d160 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e   int n2 = pB2->n
1d170 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f  ;..  /* It is po
1d180 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61  ssible to have a
1d190 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74   Blob value that
1d1a0 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65   has some non-ze
1d1b0 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  ro content.  ** 
1d1c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f  followed by zero
1d1d0 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74   content.  But t
1d1e0 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75  hat only comes u
1d1f0 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d  p for Blobs form
1d200 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f  ed.  ** by the O
1d210 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1d220 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c  ode, and such Bl
1d230 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61  obs never get pa
1d240 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
1d250 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1d260 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
1d270 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB1->flags & M
1d280 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1d290 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1==0 );.  assert
1d2a0 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20  ( (pB2->flags & 
1d2b0 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
1d2c0 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  n2==0 );..  if( 
1d2d0 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d  (pB1->flags|pB2-
1d2e0 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65  >flags) & MEM_Ze
1d2f0 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  ro ){.    if( pB
1d300 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e  1->flags & pB2->
1d310 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1d320 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d330 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1d340 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1d350 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d    }else if( pB1-
1d360 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d370 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  o ){.      if( !
1d380 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a  isAllZero(pB2->z
1d390 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75  , pB2->n) ) retu
1d3a0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74  rn -1;.      ret
1d3b0 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1d3c0 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65   - n2;.    }else
1d3d0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1d3e0 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70  llZero(pB1->z, p
1d3f0 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B1->n) ) return 
1d400 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1d410 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65   n1 - pB2->u.nZe
1d420 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ro;.    }.  }.  
1d430 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
1d440 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32  z, pB2->z, n1>n2
1d450 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69   ? n2 : n1);.  i
1d460 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1d470 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e  .  return n1 - n
1d480 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  2;.}../*.** Do a
1d490 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
1d4a0 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67  een a 64-bit sig
1d4b0 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
1d4c0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  a 64-bit floatin
1d4d0 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g-point.** numbe
1d4e0 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  r.  Return negat
1d4f0 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1d500 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1d510 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73  rst (i64) is les
1d520 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c  s than,.** equal
1d530 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1d540 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  than the second 
1d550 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  (double)..*/.sta
1d560 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
1d570 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69  ntFloatCompare(i
1d580 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b  64 i, double r){
1d590 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f  .  if( sizeof(LO
1d5a0 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38  NGDOUBLE_TYPE)>8
1d5b0 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42   ){.    LONGDOUB
1d5c0 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e  LE_TYPE x = (LON
1d5d0 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a  GDOUBLE_TYPE)i;.
1d5e0 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65      if( x<r ) re
1d5f0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1d600 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   x>r ) return +1
1d610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1d620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
1d630 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73   y;.    double s
1d640 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32  ;.    if( r<-922
1d650 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
1d660 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .0 ) return +1;.
1d670 20 20 20 20 69 66 28 20 72 3e 39 32 32 33 33 37      if( r>922337
1d680 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 20  2036854775807.0 
1d690 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d6a0 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20   y = (i64)r;.   
1d6b0 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72   if( i<y ) retur
1d6c0 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e  n -1;.    if( i>
1d6d0 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79  y ){.      if( y
1d6e0 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
1d6f0 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75   && r>0.0 ) retu
1d700 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74  rn -1;.      ret
1d710 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  urn +1;.    }.  
1d720 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b    s = (double)i;
1d730 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72  .    if( s<r ) r
1d740 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1d750 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( s>r ) return +
1d760 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1d770 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1d780 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
1d790 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68   contained by th
1d7a0 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  e two memory cel
1d7b0 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  ls, returning.**
1d7c0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20   negative, zero 
1d7d0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1d7e0 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1d7f0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1d800 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
1d810 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f  pMem2. Sorting o
1d820 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66  rder is NULL's f
1d830 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  irst, followed b
1d840 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67  y numbers (integ
1d850 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73  ers.** and reals
1d860 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63  ) sorted numeric
1d870 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  ally, followed b
1d880 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62  y text ordered b
1d890 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  y the collating.
1d8a0 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ** sequence pCol
1d8b0 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c  l and finally bl
1d8c0 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20  ob's ordered by 
1d8d0 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
1d8e0 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  Two NULL values 
1d8f0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1d900 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e  qual by this fun
1d910 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1d920 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1d930 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1d940 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  , const Mem *pMe
1d950 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  m2, const CollSe
1d960 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74  q *pColl){.  int
1d970 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63   f1, f2;.  int c
1d980 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a  ombined_flags;..
1d990 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c    f1 = pMem1->fl
1d9a0 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d  ags;.  f2 = pMem
1d9b0 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62  2->flags;.  comb
1d9c0 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c  ined_flags = f1|
1d9d0 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63  f2;.  assert( (c
1d9e0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20  ombined_flags & 
1d9f0 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
1da00 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  ;. .  /* If one 
1da10 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
1da20 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
1da30 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
1da40 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
1da50 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
1da60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1da70 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1da80 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
1da90 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29  rn (f2&MEM_Null)
1daa0 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29   - (f1&MEM_Null)
1dab0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c  ;.  }..  /* At l
1dac0 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
1dad0 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20  two values is a 
1dae0 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66  number.  */.  if
1daf0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1db00 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
1db10 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  al) ){.    if( (
1db20 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1db30 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1db40 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1db50 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1db60 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1db70 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1db80 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1db90 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1dba0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1dbb0 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1dbc0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1dbd0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1dbe0 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r < pMem2->u.
1dbf0 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1dc00 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1dc10 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r > pMem2->u.r
1dc20 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1dc30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1dc40 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1dc50 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1dc60 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1dc70 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1dc80 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1dc90 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1dca0 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70  re(pMem1->u.i, p
1dcb0 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem2->u.r);.    
1dcc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dcd0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1dce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1dcf0 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1dd00 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1dd10 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f2&MEM_Int)!=0 
1dd20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1dd30 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  n -sqlite3IntFlo
1dd40 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d  atCompare(pMem2-
1dd50 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72  >u.i, pMem1->u.r
1dd60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1dd70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1dd80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1dd90 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .    return +1;.
1dda0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1ddb0 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
1ddc0 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
1ddd0 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
1dde0 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
1ddf0 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
1de00 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
1de10 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
1de20 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
1de30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1de40 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
1de50 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
1de60 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
1de70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1de80 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1de90 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
1dea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1deb0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
1dec0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1ded0 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
1dee0 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d   || pMem1->db->m
1def0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1df00 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1df10 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1df20 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1df30 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1df40 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1df50 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1df60 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1df70 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1df80 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1df90 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1dfa0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1dfb0 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1dfc0 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1dfd0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1dfe0 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1dff0 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1e000 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1e010 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1e020 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1e030 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1e040 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1e050 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1e060 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1e070 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1e080 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1e090 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1e0a0 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1e0b0 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1e0c0 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1e0d0 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1e0e0 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1e0f0 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1e100 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1e110 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1e120 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1e130 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1e140 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1e150 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1e160 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1e170 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1e180 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1e190 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1e1a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1e1b0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1e1c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1e1d0 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1e1e0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1e1f0 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1e200 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1e210 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1e220 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1e230 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1e240 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1e250 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1e260 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1e270 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1e280 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1e290 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1e2a0 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1e2b0 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1e2c0 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1e2d0 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1e2e0 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1e2f0 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1e300 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1e310 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1e320 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1e330 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1e340 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1e350 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1e360 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1e370 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1e380 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1e390 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1e3a0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e3b0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1e3c0 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1e3d0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1e3e0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e3f0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e400 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1e410 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1e420 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1e430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e440 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e450 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1e460 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1e470 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1e480 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e490 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e4a0 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1e4b0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1e4c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1e4d0 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1e4e0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1e4f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e500 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e510 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1e520 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1e530 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1e540 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1e550 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1e560 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1e570 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1e580 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1e590 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e5a0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e5b0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1e5c0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1e5d0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1e5e0 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1e5f0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1e600 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1e610 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1e620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e630 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1e640 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1e650 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1e660 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1e670 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1e680 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1e690 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1e6a0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1e6b0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1e6c0 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1e6d0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1e6e0 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1e6f0 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1e700 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1e710 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1e720 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1e730 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1e740 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1e750 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1e760 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1e770 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1e780 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1e790 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1e7a0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1e7b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1e7c0 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1e7d0 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1e7e0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1e7f0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1e800 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1e810 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1e820 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1e830 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1e840 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1e850 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1e860 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1e870 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1e880 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1e890 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1e8a0 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1e8b0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1e8c0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1e8d0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1e8e0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1e8f0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1e900 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1e910 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1e920 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1e930 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1e940 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1e950 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1e960 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1e970 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1e980 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1e990 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1e9a0 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1e9b0 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1e9c0 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1e9d0 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1e9e0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1e9f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1ea00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ea10 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1ea20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1ea30 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1ea40 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1ea50 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1ea60 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1ea70 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1ea80 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eaa0 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1eab0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1eac0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1eaf0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1eb00 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1eb10 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1eb40 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1eb50 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1eb60 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb80 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1eb90 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1eba0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ebd0 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1ebe0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1ebf0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec10 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1ec20 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1ec30 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1ec40 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1ec50 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1ec60 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1ec70 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  o *pKeyInfo = pP
1ec80 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1ec90 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1eca0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1ecb0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ecc0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d  har *)pKey1;.  M
1ecd0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49  em mem1;..  /* I
1ece0 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c  f bSkip is true,
1ecf0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1ed00 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74   has already det
1ed10 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1ed20 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
1ed30 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1ed40 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1ed50 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20  Fix the various 
1ed60 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20  stack variables 
1ed70 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69  so.  ** that thi
1ed80 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73  s routine begins
1ed90 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68   comparing at th
1eda0 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20  e second field. 
1edb0 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29  */.  if( bSkip )
1edc0 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20  {.    u32 s1;.  
1edd0 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74    idx1 = 1 + get
1ede0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1edf0 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48  1], s1);.    szH
1ee00 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  dr1 = aKey1[0];.
1ee10 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20      d1 = szHdr1 
1ee20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  + sqlite3VdbeSer
1ee30 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a  ialTypeLen(s1);.
1ee40 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70      i = 1;.    p
1ee50 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rhs++;.  }else{.
1ee60 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61      idx1 = getVa
1ee70 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1ee80 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20  Hdr1);.    d1 = 
1ee90 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20  szHdr1;.    if( 
1eea0 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
1eeb0 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b  y1 ){ .      pPK
1eec0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1eed0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1eee0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1eef0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
1ef00 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1ef10 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1ef20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1ef30 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1ef40 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1ef50 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1ef60 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
1ef70 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1ef80 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b  Info->nField+pPK
1ef90 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1efa0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1efb0 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
1efc0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1efd0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1efe0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1eff0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1f000 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1f010 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1f020 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1f030 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1f040 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1f050 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1f060 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
1f070 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
1f080 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
1f090 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
1f0a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
1f0b0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1f0c0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
1f0d0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1f0e0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1f0f0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1f100 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =10 ){.        r
1f110 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1f120 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1f130 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1f140 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f150 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1f160 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1f170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f180 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1f190 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1f1a0 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1f1b0 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33     rc = -sqlite3
1f1c0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1f1d0 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e  pRhs->u.i, mem1.
1f1e0 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1f1f0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c  e{.        i64 l
1f200 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44  hs = vdbeRecordD
1f210 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f  ecodeInt(serial_
1f220 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d  type, &aKey1[d1]
1f230 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72  );.        i64 r
1f240 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a  hs = pRhs->u.i;.
1f250 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1f260 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1f270 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1f280 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1f290 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1f2a0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1f2b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f2c0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1f2d0 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   real */.    els
1f2e0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1f2f0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
1f300 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1f310 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1f320 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1f330 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
1f340 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1f350 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61  types 12 or grea
1f360 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20  ter are strings 
1f370 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74  and blobs (great
1f380 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20  er than.        
1f390 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70  ** numbers). Typ
1f3a0 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65  es 10 and 11 are
1f3b0 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65   currently "rese
1f3c0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1f3d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22  .        ** use"
1f3e0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1f3f0 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68  really matter wh
1f400 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  at the results o
1f410 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20  f comparing.    
1f420 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e      ** them to n
1f430 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61  umberic values a
1f440 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  re.  */.        
1f450 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1f460 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1f470 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1f480 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f4a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1f4b0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1f4c0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1f4d0 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
1f4e0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f4f0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  7 ){.          i
1f500 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73  f( mem1.u.r<pRhs
1f510 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
1f520 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f530 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f540 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d  ( mem1.u.r>pRhs-
1f550 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
1f560 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
1f5a0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65  tFloatCompare(me
1f5b0 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e  m1.u.i, pRhs->u.
1f5c0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1f5d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f5e0 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72   /* RHS is a str
1f5f0 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ing */.    else 
1f600 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1f610 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
1f620 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1f630 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1f640 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1f650 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1f660 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1f670 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f680 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20  ype<12 ){.      
1f690 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f6a0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
1f6b0 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1f6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f6d0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1f6e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e  {.        mem1.n
1f6f0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1f700 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1f710 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f720 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67  +mem1.n)==(unsig
1f730 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1f740 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1f750 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75  d1+mem1.n+1)==(u
1f760 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1f770 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1f780 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69  +mem1.n) > (unsi
1f790 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1f7a0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
1f7b0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1f7c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f7d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1f7e0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f7f0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1f800 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1f810 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
1f820 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
1f830 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e           mem1.en
1f840 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1f850 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  c;.          mem
1f860 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
1f870 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  >db;.          m
1f880 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em1.flags = MEM_
1f890 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  Str;.          m
1f8a0 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26  em1.z = (char*)&
1f8b0 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20  aKey1[d1];.     
1f8c0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
1f8d0 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d                &m
1f8f0 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49  em1, pRhs, pKeyI
1f900 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26  nfo->aColl[i], &
1f910 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a  pPKey2->errCode.
1f920 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1f930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f940 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1f950 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68   MIN(mem1.n, pRh
1f960 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1f970 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1f980 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1f990 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1f9a0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1f9b0 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68  c = mem1.n - pRh
1f9c0 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d  s->n; .        }
1f9d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f9e0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1f9f0 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65  blob */.    else
1fa00 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1fa10 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20   & MEM_Blob ){. 
1fa20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
1fa30 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1fa40 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73  Zero)==0 || pRhs
1fa50 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->n==0 );.      
1fa60 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1fa70 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1fa80 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1fa90 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1faa0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1fab0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1fac0 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  <12 || (serial_t
1fad0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1fae0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1faf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fb00 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20       int nStr = 
1fb10 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1fb20 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1fb30 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1fb40 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  tr)==(unsigned)n
1fb50 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1fb60 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1fb70 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  tr+1)==(unsigned
1fb80 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1fb90 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20    if( (d1+nStr) 
1fba0 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1fbb0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1fbc0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1fbd0 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1fbe0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1fbf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc10 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1fc20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fc30 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1fc40 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
1fc50 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1fc60 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  ro((const char*)
1fc70 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29  &aKey1[d1],nStr)
1fc80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fc90 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
1fca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fcb0 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d       rc = nStr -
1fcc0 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pRhs->u.nZero;.
1fcd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fcf0 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1fd00 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e  MIN(nStr, pRhs->
1fd10 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1fd20 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1fd30 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1fd40 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1fd50 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1fd60 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b   nStr - pRhs->n;
1fd70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fd80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1fd90 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a   RHS is null */.
1fda0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1fdb0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1fdc0 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1fdd0 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79   rc = (serial_ty
1fde0 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  pe!=0);.    }.. 
1fdf0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1fe00 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1fe10 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1fe20 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1fe30 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
1fe40 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62       assert( vdb
1fe50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1fe60 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1fe70 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b  , pPKey2, rc) );
1fe80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1fe90 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1fea0 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1feb0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1fec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fed0 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   }..    i++;.   
1fee0 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
1fef0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1ff00 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1ff10 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
1ff20 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
1ff30 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
1ff40 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
1ff50 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
1ff60 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1ff70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d  ->nField && d1<=
1ff80 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1ff90 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1ffa0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1ffb0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1ffc0 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1ffd0 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1ffe0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1fff0 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
20000 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
20010 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
20020 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
20030 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
20040 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
20050 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
20060 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
20070 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
20080 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
20090 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72  eans that one or
200a0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79   both of the key
200b0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
200c0 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
200d0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
200e0 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
200f0 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
20100 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
20110 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
20120 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
20130 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76  _DB .       || v
20140 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20150 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
20160 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65  y1, pPKey2, pPKe
20170 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20  y2->default_rc) 
20180 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49  .       || pKeyI
20190 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
201a0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b  ailed.  );.  pPK
201b0 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
201c0 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
201d0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
201e0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
201f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
20200 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
20210 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
20220 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
20230 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
20240 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
20250 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20260 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
20270 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20280 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
20290 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
202a0 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
202b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
202c0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
202d0 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
202e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
202f0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
20300 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
20310 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
20320 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
20330 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
20340 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
20350 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
20360 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
20370 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
20380 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
20390 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
203a0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
203b0 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
203c0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
203d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
203e0 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
203f0 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
20400 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
20410 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
20420 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
20430 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
20440 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20450 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
20460 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
20470 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
20480 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
20490 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
204a0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
204b0 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
204c0 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
204d0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
204e0 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
204f0 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
20500 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
20510 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
20520 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
20530 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
20540 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36  x;.  i64 v;.  i6
20550 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73  4 lhs;..  vdbeAs
20560 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
20570 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
20580 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
20590 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73  >pKeyInfo);.  as
205a0 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
205b0 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
205c0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
205d0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
205e0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
205f0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
20600 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
20610 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
20620 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
20630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
20640 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20650 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20660 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
20670 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
20680 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
20690 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
206a0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
206b0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
206c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
206d0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
206e0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
206f0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20700 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
20710 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20720 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20730 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20750 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
20760 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20770 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
20780 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
20790 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
207a0 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
207b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
207c0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
207d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
207e0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
207f0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
20800 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
20810 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20820 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
20830 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
20840 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20850 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20860 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20880 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
20890 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
208a0 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
208b0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
208c0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
208d0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
208e0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
208f0 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
20900 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
20910 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
20920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20930 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
20940 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
20950 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
20960 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
20970 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
20980 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
20990 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
209a0 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
209b0 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
209c0 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
209d0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
209e0 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
209f0 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
20a00 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
20a10 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
20a20 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
20a30 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
20a40 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
20a50 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
20a60 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
20a70 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
20a80 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
20a90 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
20aa0 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
20ab0 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
20ac0 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
20ad0 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
20ae0 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
20af0 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
20b00 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
20b10 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
20b20 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
20b30 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20b40 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20b50 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
20b60 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
20b70 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
20b80 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20b90 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
20ba0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20bb0 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  ey2);.  }..  v =
20bc0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
20bd0 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68  .u.i;.  if( v>lh
20be0 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
20bf0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
20c00 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
20c10 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20c20 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
20c30 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
20c40 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
20c50 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
20c60 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
20c70 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
20c80 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
20c90 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
20ca0 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  /.    res = sqli
20cb0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20cc0 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
20cd0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20ce0 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
20cf0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
20d00 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
20d10 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
20d20 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
20d30 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
20d40 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
20d50 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
20d60 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
20d70 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
20d80 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
20d90 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e  rc;.    pPKey2->
20da0 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a  eqSeen = 1;.  }.
20db0 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
20dc0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
20dd0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
20de0 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a  pPKey2, res) );.
20df0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
20e00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20e10 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
20e20 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
20e30 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20e40 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
20e50 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
20e60 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
20e70 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74  2 is a string, t
20e80 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73  hat (b) the firs
20e90 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20  t field.** uses 
20ea0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
20eb0 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e  quence BINARY an
20ec0 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73  d (c) that the s
20ed0 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
20ee0 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20  rint .** at the 
20ef0 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
20f00 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
20f10 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f   single byte..*/
20f20 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
20f30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
20f40 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ing(.  int nKey1
20f50 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
20f60 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
20f70 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20f80 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
20f90 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
20fa0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
20fb0 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  8 *aKey1 = (cons
20fc0 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69  t u8*)pKey1;.  i
20fd0 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  nt serial_type;.
20fe0 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
20ff0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d  sert( pPKey2->aM
21000 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[0].flags & ME
21010 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41  M_Str );.  vdbeA
21020 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
21030 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
21040 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21050 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67  ->pKeyInfo);.  g
21060 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
21070 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
21080 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
21090 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
210a0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
210b0 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
210c0 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
210d0 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
210e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
210f0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
21100 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
21110 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
21120 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
21130 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
21140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
21150 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
21160 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
21170 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
21180 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
21190 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
211a0 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
211b0 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
211c0 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
211d0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
211e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
211f0 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
21200 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
21210 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
21220 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
21230 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
21240 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
21250 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
21260 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
21270 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
21280 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
21290 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
212a0 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
212b0 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
212c0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
212d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
212e0 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
212f0 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
21300 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
21310 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
21320 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21330 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20  PKey2, 1);.     
21340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21350 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21360 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
21370 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
21380 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  eqSeen = 1;.    
21390 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
213a0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
213b0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
213c0 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
213d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
213e0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
213f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
21400 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
21410 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
21420 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
21430 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
21440 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
21450 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
21460 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21470 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
21480 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
21490 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
214a0 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
214b0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
214c0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
214d0 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
214e0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
214f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21500 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
21510 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
21520 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
21530 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
21540 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
21550 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
21560 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
21570 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
21580 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
21590 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
215a0 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
215b0 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
215c0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
215d0 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
215e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
215f0 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
21600 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
21610 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
21620 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
21630 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
21640 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
21650 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
21660 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
21670 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
21680 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
21690 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
216a0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
216b0 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
216c0 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
216d0 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
216e0 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
216f0 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
21700 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
21710 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
21720 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
21730 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
21740 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
21750 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
21760 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
21770 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
21780 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
21790 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
217a0 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
217b0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
217c0 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
217d0 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
217e0 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
217f0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
21800 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
21810 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
21820 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
21830 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
21840 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
21850 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
21860 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
21870 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
21880 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
21890 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
218a0 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
218b0 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
218c0 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
218d0 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
218e0 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
218f0 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
21900 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
21910 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ( (p->pKeyInfo->
21920 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79  nField + p->pKey
21930 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d  Info->nXField)<=
21940 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
21950 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
21960 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
21970 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
21980 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
21990 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
219a0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
219b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
219c0 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
219d0 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
219e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
219f0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
21a00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
21a10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21a20 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
21a30 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
21a40 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
21a50 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
21a60 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
21a70 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
21a80 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
21a90 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
21aa0 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
21ab0 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
21ac0 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
21ad0 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
21ae0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21af0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
21b00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21b10 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21b20 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
21b30 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
21b40 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21b50 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
21b60 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
21b70 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
21b80 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
21b90 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
21ba0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
21bb0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
21bc0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
21bd0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
21be0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
21bf0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
21c00 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
21c10 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
21c20 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
21c30 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
21c40 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
21c50 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
21c60 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
21c70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21c80 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
21c90 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
21ca0 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
21cb0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
21cc0 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
21cd0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
21ce0 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
21cf0 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
21d00 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
21d10 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
21d20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
21d30 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
21d40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
21d50 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
21d60 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
21d70 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
21d80 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
21d90 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
21da0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
21db0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
21dc0 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
21dd0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21de0 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
21df0 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
21e00 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
21e10 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
21e20 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
21e30 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
21e40 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
21e50 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
21e60 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
21e70 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
21e80 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
21e90 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
21ea0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
21eb0 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
21ec0 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
21ed0 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
21ee0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21ef0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
21f00 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
21f10 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
21f20 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
21f30 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  e(pCur);.  asser
21f40 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
21f50 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
21f60 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
21f70 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
21f80 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
21f90 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
21fa0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
21fb0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
21fc0 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
21fd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
21fe0 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
21ff0 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
22000 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
22010 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
22030 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
22040 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
22050 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
22060 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
22070 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
22080 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
22090 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
220a0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
220b0 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
220c0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
220d0 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
220e0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
220f0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
22100 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
22110 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
22120 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
22130 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
22140 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
22150 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
22160 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
22170 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
22180 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
22190 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
221a0 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
221b0 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
221c0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
221d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
221e0 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
221f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22200 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
22210 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22220 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
22230 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
22240 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22250 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
22260 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22270 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
22280 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22290 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
222a0 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
222b0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
222c0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
222d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
222e0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
222f0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
22300 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
22310 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
22320 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
22330 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
22340 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
22350 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
22360 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
22370 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
22380 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
22390 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
223a0 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
223b0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
223c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
223d0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
223e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
223f0 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
22400 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
22410 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
22420 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
22430 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
22440 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
22450 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
22460 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
22470 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
22480 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
22490 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
224a0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
224b0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
224c0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
224d0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
224e0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
224f0 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
22500 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
22510 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
22520 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
22530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22540 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
22550 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
22560 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
22570 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
22580 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
22590 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
225a0 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
225b0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
225c0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
225d0 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
225e0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
225f0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
22600 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
22610 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
22620 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
22630 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
22640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22650 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
22660 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
22670 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
22680 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
22690 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
226a0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
226b0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
226c0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
226d0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
226e0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
226f0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
22700 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
22710 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
22720 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
22730 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
22740 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
22750 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
22760 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
22770 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
22780 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
22790 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
227a0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
227b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
227c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
227d0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
227e0 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
227f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
22800 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
22810 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
22820 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
22830 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
22840 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
22850 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
22860 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22880 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
22890 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
228a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
228b0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
228c0 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
228d0 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
228e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
228f0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
22900 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
22910 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
22920 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
22930 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22940 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
22950 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71  .  nCellKey = sq
22960 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
22970 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f  dSize(pCur);.  /
22980 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20  * nCellKey will 
22990 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65  always be betwee
229a0 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66  n 0 and 0xffffff
229b0 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ff because of th
229c0 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20  e way.  ** that 
229d0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
229e0 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47  r() and sqlite3G
229f0 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65  etVarint32() are
22a00 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a   implemented */.
22a10 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
22a20 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
22a30 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  7fffffff ){.    
22a40 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
22a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22a60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
22a70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
22a80 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
22a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
22aa0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
22ab0 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  ur, 0, (u32)nCel
22ac0 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28  lKey, &m);.  if(
22ad0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
22ae0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
22af0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
22b00 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
22b10 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
22b20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
22b30 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
22b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22b50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
22b60 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
22b70 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
22b80 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
22b90 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
22ba0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
22bb0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
22bc0 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
22bd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22be0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
22bf0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
22c00 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
22c10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22c20 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
22c30 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
22c40 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
22c50 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
22c60 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
22c70 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
22c80 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
22c90 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
22ca0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
22cb0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
22cc0 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
22cd0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
22ce0 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
22cf0 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
22d00 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
22d10 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
22d20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
22d30 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
22d40 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
22d50 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
22d60 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
22d70 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
22d80 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
22d90 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
22da0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
22db0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
22dc0 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
22dd0 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
22de0 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
22df0 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
22e00 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
22e10 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
22e20 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
22e30 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
22e40 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
22e50 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
22e60 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
22e70 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
22e80 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
22e90 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
22ea0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
22eb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22ec0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
22ed0 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
22ee0 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
22ef0 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
22f00 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
22f10 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
22f20 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
22f30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22f40 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
22f50 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
22f60 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
22f70 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
22f80 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
22f90 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
22fa0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22fb0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
22fc0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
22fd0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
22fe0 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
22ff0 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
23000 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
23010 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
23020 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
23030 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
23040 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
23050 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
23060 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
23070 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
23080 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
23090 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
230a0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
230b0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
230c0 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
230d0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
230e0 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
230f0 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
23100 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
23110 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
23120 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
23130 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
23140 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
23150 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
23160 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
23170 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
23180 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
23190 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
231a0 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
231b0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
231c0 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
231d0 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
231e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
231f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23200 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
23210 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
23220 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23230 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
23240 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
23250 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
23260 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
23270 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
23280 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
23290 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
232a0 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
232b0 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
232c0 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
232d0 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
232e0 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
232f0 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
23300 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
23310 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
23320 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
23330 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
23340 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
23350 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
23360 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
23370 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
23380 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e  0 );.  if( iVar>
23390 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  =32 ){.    v->ex
233a0 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30  pmask |= 0x80000
233b0 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  000;.  }else{.  
233c0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
233d0 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
233e0 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  -1));.  }.}..#if
233f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23400 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
23410 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72  .** Transfer err
23420 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
23430 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f  from an sqlite3_
23440 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65  vtab.zErrMsg (te
23450 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
23460 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
23470 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
23480 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65  loc) into a Vdbe
23490 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
234a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
234b0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
234c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
234d0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
234e0 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
234f0 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69  sg(Vdbe *p, sqli
23500 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
23510 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a  {.  if( pVtab->z
23520 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71  ErrMsg ){.    sq
23530 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
23540 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  b;.    sqlite3Db
23550 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
23560 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
23570 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
23580 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62  StrDup(db, pVtab
23590 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
235a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
235b0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
235c0 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
235d0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
235e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
235f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
23600 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
23610 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
23620 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66  E_HOOK../*.** If
23630 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
23640 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
23650 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c  , release any al
23660 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
23670 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68  ated .** with th
23680 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69  e memory cells i
23690 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20  n the p->aMem[] 
236a0 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65  array. Also free
236b0 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63   the UnpackedRec
236c0 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
236d0 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73   itself, using s
236e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
236f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
23700 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66  ion is used to f
23710 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ree UnpackedReco
23720 72 64 20 73 74 72 75 63 74 75 72 65 73 20 61 6c  rd structures al
23730 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
23740 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f  e vdbeUnpackReco
23750 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  rd() function fo
23760 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63  und in vdbeapi.c
23770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23780 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
23790 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
237a0 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63  nt nField, Unpac
237b0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
237c0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
237d0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
237e0 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  ; i<nField; i++)
237f0 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
23800 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b  m = &p->aMem[i];
23810 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
23820 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  >zMalloc ) sqlit
23830 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
23840 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
23850 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
23860 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  N(db, p);.  }.}.
23870 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23880 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
23890 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65  E_HOOK */..#ifde
238a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
238b0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
238c0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
238d0 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e  pre-update hook.
238e0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55   If this is an U
238f0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
23900 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c  pre-update call,
23910 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20  .** then cursor 
23920 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
23930 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68  cond argument sh
23940 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68  ould point to th
23950 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74  e row about.** t
23960 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64  o be update or d
23970 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61  eleted. If the a
23980 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73  pplication calls
23990 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
239a0 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65  te_old(),.** the
239b0 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20   required value 
239c0 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
239d0 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  m the row the cu
239e0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  rsor points to..
239f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
23a00 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
23a10 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d      /* Vdbe pre-
23a40 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69  update hook is i
23a50 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56  nvoked by */.  V
23a60 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  dbeCursor *pCsr,
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a80 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62  * Cursor to grab
23a90 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72   old.* values fr
23aa0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  om */.  int op, 
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
23ad0 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  E_INSERT, UPDATE
23ae0 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   or DELETE */.  
23af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
23b20 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
23b30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
23b40 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65        /* Modifie
23b50 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34  d table */.  i64
23b60 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20   iKey1,         
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b80 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75  Initial key valu
23b90 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bb0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
23bc0 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63  er for new.* rec
23bd0 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ord */.){.  sqli
23be0 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b  te3 *db = v->db;
23bf0 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20  .  i64 iKey2;.  
23c00 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64  PreUpdate preupd
23c10 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ate;.  const cha
23c20 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e  r *zTbl = pTab->
23c30 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20  zName;.  static 
23c40 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72  const u8 fakeSor
23c50 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61  tOrder = 0;..  a
23c60 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55  ssert( db->pPreU
23c70 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65  pdate==0 );.  me
23c80 6d 73 65 74 28 26 70 72 65 75 70 64 61 74 65 2c  mset(&preupdate,
23c90 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70   0, sizeof(PreUp
23ca0 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61  date));.  if( Ha
23cb0 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20  sRowid(pTab)==0 
23cc0 29 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69  ){.    iKey1 = i
23cd0 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72  Key2 = 0;.    pr
23ce0 65 75 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71  eupdate.pPk = sq
23cf0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
23d00 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65  ndex(pTab);.  }e
23d10 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d  lse{.    if( op=
23d20 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29  =SQLITE_UPDATE )
23d30 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
23d40 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e  v->aMem[iReg].u.
23d50 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
23d60 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79      iKey2 = iKey
23d70 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
23d80 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46  assert( pCsr->nF
23d90 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
23da0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73   .       || (pCs
23db0 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
23dc0 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53  >nCol+1 && op==S
23dd0 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20  QLITE_DELETE && 
23de0 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a  iReg==-1).  );..
23df0 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20    preupdate.v = 
23e00 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  v;.  preupdate.p
23e10 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72  Csr = pCsr;.  pr
23e20 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b  eupdate.op = op;
23e30 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65  .  preupdate.iNe
23e40 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70  wReg = iReg;.  p
23e50 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
23e60 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75  .db = db;.  preu
23e70 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e  pdate.keyinfo.en
23e80 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70  c = ENC(db);.  p
23e90 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
23ea0 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e  .nField = pTab->
23eb0 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74  nCol;.  preupdat
23ec0 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f  e.keyinfo.aSortO
23ed0 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b  rder = (u8*)&fak
23ee0 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72  eSortOrder;.  pr
23ef0 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20  eupdate.iKey1 = 
23f00 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61  iKey1;.  preupda
23f10 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32  te.iKey2 = iKey2
23f20 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54  ;.  preupdate.pT
23f30 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62  ab = pTab;..  db
23f40 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26  ->pPreUpdate = &
23f50 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d  preupdate;.  db-
23f60 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
23f70 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61  ack(db->pPreUpda
23f80 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a  teArg, db, op, z
23f90 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c  Db, zTbl, iKey1,
23fa0 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70   iKey2);.  db->p
23fb0 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  PreUpdate = 0;. 
23fc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23fd0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65  b, preupdate.aRe
23fe0 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65  cord);.  vdbeFre
23ff0 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72  eUnpacked(db, pr
24000 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
24010 6e 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64  nField+1, preupd
24020 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a  ate.pUnpacked);.
24030 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b    vdbeFreeUnpack
24040 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ed(db, preupdate
24050 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 2b  .keyinfo.nField+
24060 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65  1, preupdate.pNe
24070 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66  wUnpacked);.  if
24080 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  ( preupdate.aNew
24090 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
240a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
240b0 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  sr->nField; i++)
240c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
240d0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70  dbeMemRelease(&p
240e0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d  reupdate.aNew[i]
240f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
24100 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
24110 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
24120 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
24130 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
24140 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
24150 2f 0a                                            /.