/ Hex Artifact Content
Login

Artifact 3cf14d047121c2dfabe85d874262a36a4d8983616fc0da7faff197ed3dd0617a:


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 70 42 74      if( pCx->pBt
f2d0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
f2e0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
f2f0: 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20  Cx->pBtx);.     
f300: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
f310: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
f320: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
f330: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
f340: 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  , by.        ** 
f350: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
f360: 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
f370: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f380: 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  pCx->uc.pCursor!
f390: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
f3a0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
f3b0: 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43  ursor(pCx->uc.pC
f3c0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
f3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f3e0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f3f0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
f400: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 52  BLE.    case CUR
f410: 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20  TYPE_VTAB: {.   
f420: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
f430: 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20  cursor *pVCur = 
f440: 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20  pCx->uc.pVCur;. 
f450: 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74       const sqlit
f460: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
f470: 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61  le = pVCur->pVta
f480: 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
f490: 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72 2d    assert( pVCur-
f4a0: 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29  >pVtab->nRef>0 )
f4b0: 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70  ;.      pVCur->p
f4c0: 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Vtab->nRef--;.  
f4d0: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
f4e0: 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20  ose(pVCur);.    
f4f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f500: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
f510: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
f520: 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72  sors in the curr
f530: 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74  ent frame..*/.st
f540: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43  atic void closeC
f550: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64  ursorsInFrame(Vd
f560: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
f570: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
f580: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f590: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
f5a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
f5b0: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
f5c0: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
f5d0: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
f5e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
f5f0: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
f600: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
f610: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
f620: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
f630: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
f640: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
f650: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
f660: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
f670: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
f680: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
f690: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
f6a0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
f6b0: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
f6c0: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
f6d0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
f6e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
f6f0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
f700: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
f710: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
f720: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f  pFrame->v;.  clo
f730: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f740: 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (v);.#ifdef SQLI
f750: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
f760: 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61  CANSTATUS.  v->a
f770: 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e  nExec = pFrame->
f780: 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20  anExec;.#endif. 
f790: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
f7a0: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
f7b0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
f7c0: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
f7d0: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
f7e0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
f7f0: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
f800: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
f810: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
f820: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
f830: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
f840: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
f850: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
f860: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
f870: 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e  hange;.  v->db->
f880: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
f890: 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73  ->nDbChange;.  s
f8a0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
f8b0: 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26  AuxData(v->db, &
f8c0: 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  v->pAuxData, -1,
f8d0: 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61   0);.  v->pAuxDa
f8e0: 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75  ta = pFrame->pAu
f8f0: 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d  xData;.  pFrame-
f900: 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20  >pAuxData = 0;. 
f910: 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e   return pFrame->
f920: 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  pc;.}../*.** Clo
f930: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  se all cursors..
f940: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61  **.** Also relea
f950: 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d  se any dynamic m
f960: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
f970: 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65  e VM in the Vdbe
f980: 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a  .aMem memory .**
f990: 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69   cell array. Thi
f9a0: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61  s is necessary a
f9b0: 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  s the memory cel
f9c0: 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74  l array may cont
f9d0: 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20  ain.** pointers 
f9e0: 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  to VdbeFrame obj
f9f0: 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ects, which may 
fa00: 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20  in turn contain 
fa10: 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f  pointers to.** o
fa20: 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  pen cursors..*/.
fa30: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
fa40: 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65  eAllCursors(Vdbe
fa50: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
fa60: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
fa70: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
fa80: 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
fa90: 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
faa0: 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
fab0: 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
fac0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
fad0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
fae0: 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  pFrame);.    p->
faf0: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  pFrame = 0;.    
fb00: 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->nFrame = 0;. 
fb10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
fb20: 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63  nFrame==0 );.  c
fb30: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
fb40: 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  me(p);.  if( p->
fb50: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
fb60: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
fb70: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
fb80: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
fb90: 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  DelFrame ){.    
fba0: 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20  VdbeFrame *pDel 
fbb0: 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  = p->pDelFrame;.
fbc0: 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65      p->pDelFrame
fbd0: 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74   = pDel->pParent
fbe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fbf0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65  eFrameDelete(pDe
fc00: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  l);.  }..  /* De
fc10: 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61  lete any auxdata
fc20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64   allocations mad
fc30: 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20  e by the VM */. 
fc40: 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61   if( p->pAuxData
fc50: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65   ) sqlite3VdbeDe
fc60: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64  leteAuxData(p->d
fc70: 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c  b, &p->pAuxData,
fc80: 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72   -1, 0);.  asser
fc90: 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d  t( p->pAuxData==
fca0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  0 );.}../*.** Cl
fcb0: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
fcc0: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e  ter a single run
fcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fce0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
fcf0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
fd00: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
fd10: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
fd20: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
fd30: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
fd40: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
fd50: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
fd60: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
fd70: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
fd80: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
fd90: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
fda0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
fdb0: 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
fdc0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
fdd0: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
fde0: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
fdf0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
fe00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
fe10: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
fe20: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
fe30: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
fe40: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
fe50: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
fe60: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
fe70: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
fe80: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
fe90: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
fea0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
feb0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
fec0: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
fed0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
fee0: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
fef0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
ff00: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
ff10: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
ff20: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
ff30: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
ff40: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
ff50: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
ff60: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
ff70: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
ff80: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
ff90: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
ffa0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
ffb0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
ffc0: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
ffd0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
ffe0: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
fff0: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
10000 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
10010 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
10020 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
10030 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
10040 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
10050 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
10060 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
10070 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
10080 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
10090 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
100a0 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
100b0 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
100c0 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
100d0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
100e0 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
100f0 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
10100 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
10110 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72  rn;.  initMemArr
10120 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
10130 6e 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  n, p->db, MEM_Nu
10140 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ll);.}../*.** Se
10150 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
10160 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
10170 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
10180 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
10190 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
101a0 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
101b0 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
101c0 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
101d0 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
101e0 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
101f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
10200 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
10210 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
10220 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
10230 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
10240 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
10250 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
10260 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
10270 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
10280 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
10290 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
102a0 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
102b0 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
102c0 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
102d0 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
102e0 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
102f0 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
10300 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
10310 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
10340 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
10350 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10380 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
10390 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
103a0 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
103c0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
103d0 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
103e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
103f0 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
10400 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10410 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
10420 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
10430 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
10440 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
10450 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
10460 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
10470 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
10480 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
10490 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
104a0 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
104b0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
104c0 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
104d0 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
104e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
104f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
10500 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
10510 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
10520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10530 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10540 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
10550 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
10560 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
10570 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
10580 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
10590 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
105a0 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
105b0 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
105c0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
105d0 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
105e0 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
105f0 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
10600 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
10610 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
10620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
10630 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
10640 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
10650 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
10660 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
10670 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
10680 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
10690 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
106a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
106b0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
106c0 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
106d0 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
106e0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
106f0 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
10700 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
10710 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
10720 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
10730 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
10740 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
10750 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
10760 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
10770 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
10780 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
10790 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
107a0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nsaction.       
107b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
107c0 68 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74  hat are candidat
107d0 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61  es for a two-pha
107e0 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20  se commit using 
107f0 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
10800 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a       ** master-j
10810 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
10820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10830 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
10840 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
10850 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10860 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
10870 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
10880 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
10890 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
108a0 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
108b0 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
108c0 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
108d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
108e0 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
108f0 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
10900 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
10910 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
10920 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
10930 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
10940 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
10950 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
10960 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
10970 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
10980 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
10990 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
109a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
109b0 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
109c0 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
109d0 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
109e0 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
109f0 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
10a00 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
10a10 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
10a20 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
10a30 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
10a40 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
10a50 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
10a60 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
10a70 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
10a80 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
10a90 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
10aa0 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
10ab0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
10ac0 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
10ad0 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
10ae0 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
10af0 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
10b00 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
10b10 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
10b20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
10b30 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
10b40 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
10b50 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
10b60 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
10b70 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
10b80 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
10b90 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
10ba0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
10bb0 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
10bc0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
10bd0 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
10be0 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
10bf0 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
10c00 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20    /* Whether or 
10c10 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d  not a database m
10c20 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74  ight need a mast
10c30 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e  er journal depen
10c40 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a  ds upon.      **
10c50 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   its journal mod
10c60 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74  e (among other t
10c70 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61  hings).  This ma
10c80 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20  trix determines 
10c90 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a  which.      ** j
10ca0 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65  ournal modes use
10cb0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10cc0 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e  l and which do n
10cd0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ot */.      stat
10ce0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e  ic const u8 aMJN
10cf0 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  eeded[] = {.    
10d00 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20      /* DELETE   
10d10 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f  */  1,.        /
10d20 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31  * PERSIST   */ 1
10d30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  ,.        /* OFF
10d40 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20         */ 0,.   
10d50 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45       /* TRUNCATE
10d60 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20    */ 1,.        
10d70 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20  /* MEMORY    */ 
10d80 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41  0,.        /* WA
10d90 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20  L       */ 0.   
10da0 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65     };.      Page
10db0 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20  r *pPager;   /* 
10dc0 50 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  Pager associated
10dd0 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20   with pBt */.   
10de0 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
10df0 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
10e00 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
10e10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d  ;.      pPager =
10e20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
10e30 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  er(pBt);.      i
10e40 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61  f( db->aDb[i].sa
10e50 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45  fety_level!=PAGE
10e60 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
10e70 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e  F.       && aMJN
10e80 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67  eeded[sqlite3Pag
10e90 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
10ea0 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20  (pPager)].      
10eb0 29 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  ){ .        asse
10ec0 72 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20  rt( i!=1 );.    
10ed0 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20      nTrans++;.  
10ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
10ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
10f00 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
10f10 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
10f20 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
10f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10f50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10f60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
10f70 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
10f80 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
10f90 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
10fa0 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
10fb0 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
10fc0 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
10fd0 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
10fe0 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
10ff0 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
11000 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
11010 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
11020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11030 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
11040 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
11050 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
11060 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
11070 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
11080 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
11090 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
110a0 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
110b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
110c0 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
110d0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
110e0 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
110f0 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
11100 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
11110 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
11120 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
11130 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
11140 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
11150 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
11160 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
11170 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
11180 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
11190 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
111a0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
111b0 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
111c0 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
111d0 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
111e0 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
111f0 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
11200 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
11210 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
11220 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
11230 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
11240 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
11250 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
11260 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
11270 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11280 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11290 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
112a0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
112b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
112c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
112d0 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
112e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
112f0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
11300 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
11310 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
11320 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
11330 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
11340 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
11350 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
11360 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
11370 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
11380 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
11390 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
113a0 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
113b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
113c0 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
113d0 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
113e0 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
113f0 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
11400 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
11410 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
11420 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
11430 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
11440 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
11450 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
11460 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
11470 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11480 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
11490 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
114a0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
114b0 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
114c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
114d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
114e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
114f0 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
11500 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
11510 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
11520 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
11530 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
11540 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
11550 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
11560 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
11570 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
11580 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
11590 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
115a0 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tted atomically.
115b0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
115c0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
115d0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
115e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
115f0 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63   db->pVfs;.    c
11600 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
11610 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
11620 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
11630 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
11640 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
11650 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
11660 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
11670 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
11680 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
11690 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
116a0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
116b0 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
116c0 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75      int retryCou
116d0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
116e0 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20  nMainFile;..    
116f0 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
11700 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11710 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69  name */.    nMai
11720 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53  nFile = sqlite3S
11730 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c  trlen30(zMainFil
11740 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  e);.    zMaster 
11750 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11760 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58  (db, "%s-mjXXXXX
11770 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c  X9XXz", zMainFil
11780 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73  e);.    if( zMas
11790 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
117a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
117b0 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  T;.    do {.    
117c0 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
117d0 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
117e0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
117f0 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
11800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
11810 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
11820 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
11830 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
11840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11850 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
11860 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
11870 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11880 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11890 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
118a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
118b0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
118c0 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
118d0 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
118e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
118f0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
11900 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
11910 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
11920 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
11930 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
11940 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11950 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
11960 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
11970 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
119a0 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
119b0 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
119c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
119d0 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
119e0 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
119f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11a00 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
11a10 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
11a20 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
11a30 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
11a40 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
11a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
11a60 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
11a70 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
11a80 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
11a90 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
11aa0 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
11ab0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
11ac0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
11ad0 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
11ae0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
11af0 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
11b00 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
11b10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
11b20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11b40 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
11b50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
11b60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11b70 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
11b80 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
11b90 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
11ba0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
11bb0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
11bc0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
11bd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11be0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
11bf0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
11c00 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
11c10 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
11c20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11c30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11c40 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
11c50 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
11c60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
11c70 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11c80 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
11c90 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
11ca0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
11cb0 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
11cc0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
11cd0 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
11ce0 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
11cf0 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
11d00 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
11d10 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11d20 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
11d30 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
11d40 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
11d50 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
11d60 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
11d70 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
11d80 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
11d90 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
11da0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
11db0 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
11dc0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
11dd0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
11de0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
11df0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11e00 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11e10 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
11e20 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
11e30 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
11e40 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
11e50 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
11e60 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
11e70 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
11e80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
11e90 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
11ea0 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
11eb0 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
11ec0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
11ed0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11ee0 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
11ef0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11f00 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74  te3OsWrite(pMast
11f10 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74  er, zFile, sqlit
11f20 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
11f30 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
11f40 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
11f50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11f60 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
11f70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11f90 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
11fa0 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
11fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11fc0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11fd0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
11fe0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11ff0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
12000 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12010 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
12020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12030 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
12040 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12050 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
12060 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
12070 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
12080 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
12090 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
120a0 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73  */.    if( 0==(s
120b0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
120c0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
120d0 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
120e0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
120f0 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
12100 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
12110 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
12120 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
12130 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
12140 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12150 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
12160 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
12170 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12180 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
12190 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
121a0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
121b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
121c0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
121d0 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
121e0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
121f0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
12200 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
12210 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
12220 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
12230 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
12240 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
12250 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
12260 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
12270 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
12280 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12290 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
122a0 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
122b0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
122c0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
122d0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
122e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
122f0 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
12300 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
12310 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
12320 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
12330 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
12340 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
12350 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
12360 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
12370 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12380 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
12390 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
123a0 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
123b0 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
123c0 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
123d0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
123e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
123f0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12400 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
12410 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12420 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
12430 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
12440 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12450 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
12460 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
12470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12480 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
12490 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
124a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
124b0 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
124c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
124d0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
124e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
124f0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
12500 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
12510 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
12520 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12530 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
12540 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
12550 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
12560 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
12570 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
12580 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
12590 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
125a0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
125b0 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
125c0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
125d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
125e0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
125f0 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
12600 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12610 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
12620 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
12630 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
12640 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
12650 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
12660 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
12670 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
12680 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
12690 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
126a0 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
126b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
126c0 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
126d0 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
126e0 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
126f0 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
12700 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
12710 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
12720 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
12730 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
12740 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
12750 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
12760 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
12770 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
12780 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
12790 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
127a0 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
127b0 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
127c0 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
127d0 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
127e0 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
127f0 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
12800 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
12810 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12820 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
12830 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
12840 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
12850 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12860 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
12870 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
12880 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
12890 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
128a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
128b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
128c0 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 1);.      }.
128d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
128e0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
128f0 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  ();.    enable_s
12900 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12910 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
12920 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
12930 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12950 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12960 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
12970 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41  e sqlite3.nVdbeA
12980 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69  ctive count vari
12990 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
129a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
129b0 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
129c0 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
129d0 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
129e0 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
129f0 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
12a00 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
12a10 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
12a20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
12a30 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
12a40 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
12a50 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
12a60 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
12a70 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
12a80 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
12a90 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
12aa0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
12ab0 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
12ac0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
12ad0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
12ae0 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
12af0 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
12b00 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Write = 0;.  int
12b10 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20   nRead = 0;.  p 
12b20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
12b30 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
12b40 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
12b50 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74  busy((sqlite3_st
12b60 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20  mt*)p) ){.      
12b70 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
12b80 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
12b90 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
12ba0 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
12bb0 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
12bc0 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
12bd0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
12be0 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
12bf0 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
12c00 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
12c10 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
12c20 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
12c30 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
12c40 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
12c50 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
12c60 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
12c70 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
12c80 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
12c90 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
12ca0 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
12cb0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
12cc0 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
12cd0 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
12ce0 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
12cf0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
12d00 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
12d10 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
12d20 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12d30 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
12d40 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
12d50 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
12d60 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
12d70 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
12d80 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
12d90 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12da0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
12db0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
12dc0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
12dd0 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
12de0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
12df0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
12e00 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
12e10 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
12e20 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
12e30 20 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74   int vdbeCloseSt
12e40 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
12e50 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
12e60 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
12e70 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
12e80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12e90 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69  int i;.  const i
12ea0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
12eb0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
12ec0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ..  assert( eOp=
12ed0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12ee0 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
12ef0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
12f00 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
12f10 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
12f20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
12f30 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
12f40 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
12f50 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72  point) );..  for
12f60 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12f70 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20   i++){ .    int 
12f80 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
12f90 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
12fa0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
12fb0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b  ;.    if( pBt ){
12fc0 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
12fd0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12fe0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
12ff0 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
13000 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
13010 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13020 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
13030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13040 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
13050 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
13060 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
13070 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
13080 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
13090 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
130a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
130b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
130c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
130d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
130e0 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65    }.  db->nState
130f0 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74  ment--;.  p->iSt
13100 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
13110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13120 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70  K ){.    if( eOp
13130 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
13140 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  BACK ){.      rc
13150 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
13160 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
13170 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
13180 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
13190 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
131a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
131b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
131c0 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
131d0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
131e0 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
131f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13200 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
13210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13220 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
13230 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
13240 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
13250 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
13260 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
13270 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
13280 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
13290 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
132a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
132b0 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
132c0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
132d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
132e0 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
132f0 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
13300 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62  tDefCons;.    db
13310 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
13320 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
13330 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72  ImmCons;.  }.  r
13340 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
13350 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
13360 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
13370 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69  p, int eOp){.  i
13380 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65  f( p->db->nState
13390 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
133a0 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74  ement ){.    ret
133b0 75 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61  urn vdbeCloseSta
133c0 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a  tement(p, eOp);.
133d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
133e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
133f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13400 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
13410 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
13420 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
13430 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
13440 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
13450 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
13460 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
13470 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
13480 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
13490 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
134a0 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
134b0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
134c0 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
134d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
134e0 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
134f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
13500 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
13510 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
13520 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
13530 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13540 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
13550 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
13560 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
13570 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
13580 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
13590 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
135a0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
135b0 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
135c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
135d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
135e0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
135f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13600 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
13610 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
13620 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13630 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
13640 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
13650 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
13660 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
13670 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
13680 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
13690 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
136a0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
136b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
136c0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
136d0 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
136e0 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
136f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
13700 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b  or(p, "FOREIGN K
13710 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
13720 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
13730 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13740 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
13750 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
13760 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
13770 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
13780 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
13790 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
137a0 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
137b0 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
137c0 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
137d0 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
137e0 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
137f0 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
13800 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
13810 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
13820 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
13830 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
13840 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
13850 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
13860 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
13870 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
13880 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
13890 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
138a0 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
138b0 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
138c0 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
138d0 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
138e0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
138f0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
13900 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
13910 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
13920 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
13930 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
13940 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
13950 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
13960 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
13970 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
13980 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
13990 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
139a0 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
139b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
139c0 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
139d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
13a00 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
13a10 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
13a20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13a30 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
13a40 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
13a50 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
13a60 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
13a70 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
13a80 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13a90 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
13aa0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
13ab0 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
13ac0 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
13ad0 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
13ae0 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
13af0 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
13b00 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
13b10 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
13b20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
13b30 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
13b40 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
13b50 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
13b60 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
13b70 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
13b80 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
13b90 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
13ba0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
13bb0 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
13bc0 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
13bd0 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
13be0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
13bf0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13c00 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
13c10 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
13c20 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
13c30 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
13c40 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
13c50 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
13c60 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ..  if( p->magic
13c70 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
13c80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13c90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13ca0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13cb0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
13cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13cd0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f  _BKPT;.  }.  clo
13ce0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
13cf0 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
13d00 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
13d10 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
13d20 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
13d30 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
13d40 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
13d50 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
13d60 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
13d70 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
13d80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13d90 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
13da0 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
13db0 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
13dc0 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
13dd0 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
13de0 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
13df0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
13e00 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
13e10 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
13e20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
13e30 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
13e40 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
13e50 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
13e60 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
13e70 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
13e90 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
13ea0 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
13eb0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
13ec0 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
13ed0 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
13ee0 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
13ef0 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
13f00 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
13f10 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13f30 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
13f40 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
13f50 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 20 20  SQLITE_FULL.    
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
13f80 45 5f 42 55 53 59 5f 44 45 41 44 4c 4f 43 4b 3b  E_BUSY_DEADLOCK;
13f90 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
13fa0 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
13fb0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
13fc0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
13fd0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
13fe0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
13ff0 52 52 55 50 54 0a 20 20 20 20 20 20 2a 2a 20 6f  RRUPT.      ** o
14000 72 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 45  r SQLITE_BUSY_SE
14010 52 56 45 52 2c 20 6e 6f 20 72 6f 6c 6c 62 61 63  RVER, no rollbac
14020 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
14030 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 0a 20  Otherwise, at . 
14040 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 61 20       ** least a 
14050 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
14060 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
14070 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
14080 74 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a  tore the.      *
14090 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  * database to a 
140a0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
140b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
140c0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
140d0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
140e0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
140f0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
14100 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
14110 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
14120 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
14130 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
14140 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
14150 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
14160 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
14170 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
14180 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
14190 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
141a0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
141b0 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
141c0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
141d0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
141e0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
141f0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
14200 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
14210 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
14220 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
14230 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
14240 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
14250 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
14260 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 28  p->readOnly || (
14270 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
14280 52 52 55 50 54 20 26 26 20 6d 72 63 21 3d 53 51  RRUPT && mrc!=SQ
14290 4c 49 54 45 5f 42 55 53 59 29 20 29 7b 0a 20 20  LITE_BUSY) ){.  
142a0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
142b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
142c0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
142d0 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
142e0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
142f0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
14300 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
14310 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
14320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14330 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
14340 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
14350 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
14360 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
14370 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
14380 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
14390 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
143a0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
143b0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
143c0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
143d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
143e0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
143f0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14400 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14410 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
14420 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14430 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
14440 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
14450 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14460 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14480 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
14490 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
144a0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
144b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
144c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
144d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
144e0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
144f0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
14500 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
14510 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
14520 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
14530 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
14540 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
14550 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
14560 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
14570 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
14580 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
14590 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
145a0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
145b0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
145c0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
145d0 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
145e0 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
145f0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
14600 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
14610 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
14620 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
14630 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
14640 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
14650 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
14660 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
14670 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14680 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
14690 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
146a0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
146b0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
146c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
146d0 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
146e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
146f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
14710 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
14720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14730 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
14740 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
14750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14760 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
14770 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
14780 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14790 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
147a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
147b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
147c0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
147d0 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
147e0 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
147f0 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
14800 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
14810 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
14820 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
14830 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
14840 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
14850 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
14860 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
14870 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14880 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
14890 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
148a0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
148b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
148c0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
148d0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
148e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
148f0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
14900 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14920 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
14930 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14940 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
14950 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
14960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14970 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14980 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
14990 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
149a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
149b0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
149c0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
149d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149e0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
149f0 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
14a00 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
14a10 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
14a20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
14a30 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
14a40 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
14a50 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
14a60 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
14a70 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
14a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a90 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14aa0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14ab0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
14ac0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
14ae0 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
14af0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
14b00 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
14b10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
14b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
14b30 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
14b40 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
14b50 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
14b60 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
14b70 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
14b80 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
14b90 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
14ba0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
14bb0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
14bc0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
14bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14be0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14bf0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14c00 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
14c20 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
14c30 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
14c40 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
14c50 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14c60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14c70 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
14c80 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
14c90 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
14ca0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
14cb0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
14cc0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
14cd0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
14ce0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
14cf0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14d00 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
14d10 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
14d20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
14d30 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
14d40 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
14d50 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
14d60 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
14d70 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
14d80 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
14d90 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
14da0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
14db0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
14dc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14dd0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
14de0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14df0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14e00 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
14e10 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
14e20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
14e30 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14e40 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
14e50 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
14e60 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
14e70 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
14e80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14e90 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
14ea0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
14eb0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
14ec0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14ed0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14ee0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14ef0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
14f00 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
14f10 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
14f20 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
14f30 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14f40 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
14f50 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14f60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
14f70 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
14f80 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
14f90 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
14fa0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
14fb0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
14fc0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
14fd0 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
14fe0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14ff0 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
15000 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
15010 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
15020 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
15030 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
15040 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15050 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
15060 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
15070 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
15080 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
15090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
150a0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
150b0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
150c0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
150d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
150e0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
150f0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
15100 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
15110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
15120 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
15130 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
15140 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
15150 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
15160 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15170 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
15180 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
15190 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
151a0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
151b0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
151c0 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
151d0 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
151e0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
151f0 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
15200 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
15210 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
15220 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
15230 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
15240 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
15250 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
15260 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
15270 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
15280 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
15290 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
152a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
152b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
152c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
152d0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
152e0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
152f0 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
15300 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
15310 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
15320 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
15330 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
15340 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
15350 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
15360 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
15370 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
15380 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
15390 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
153a0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
153b0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
153c0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
153d0 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
153e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
153f0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
15400 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
15410 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
15420 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
15430 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
15440 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
15450 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
15460 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
15470 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
15480 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
15490 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
154a0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
154b0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
154c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
154d0 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
154e0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
154f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15500 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
15510 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
15520 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15530 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
15540 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
15550 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
15560 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
15570 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
15580 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
15590 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
155a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
155b0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
155c0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
155d0 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
155e0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
155f0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
15600 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
15610 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
15620 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
15630 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
15640 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
15650 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
15660 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
15670 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15680 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
15690 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
156a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
156b0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
156c0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
156d0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
156e0 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
156f0 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  loc++;.    sqlit
15700 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
15710 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
15720 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
15730 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
15740 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
15750 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15760 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
15770 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
15780 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
15790 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
157a0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
157b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
157c0 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
157d0 63 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  c--;.    db->err
157e0 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
157f0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
15800 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
15810 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15820 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15830 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
15840 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
15850 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
15860 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
15870 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
15880 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
15890 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
158a0 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
158b0 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
158c0 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
158d0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
158e0 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
158f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
15900 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
15910 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
15920 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
15930 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
15940 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
15950 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
15960 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
15970 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
15980 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15990 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
159a0 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
159b0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
159c0 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
159d0 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
159e0 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
159f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15a00 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
15a10 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
15a20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15a30 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
15a40 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
15a50 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
15a60 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
15a70 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
15a80 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
15a90 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
15aa0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
15ab0 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
15ac0 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
15ad0 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
15ae0 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
15af0 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
15b00 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
15b10 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
15b20 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
15b30 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
15b40 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
15b50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
15b60 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
15b70 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
15b80 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
15b90 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
15ba0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
15bb0 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
15bc0 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
15bd0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
15be0 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
15bf0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
15c00 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
15c10 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
15c20 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
15c30 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
15c40 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
15c50 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
15c60 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
15c70 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
15c80 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
15c90 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
15ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
15cb0 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
15cc0 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
15cd0 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
15ce0 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
15cf0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
15d00 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
15d10 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
15d20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
15d30 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
15d40 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
15d50 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
15d60 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
15d70 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
15d80 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
15d90 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
15da0 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
15db0 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
15dc0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
15dd0 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
15de0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15df0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
15e00 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
15e10 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
15e20 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
15e30 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
15e40 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
15e50 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
15e60 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
15e70 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
15e80 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
15e90 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
15ea0 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
15eb0 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
15ec0 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
15ed0 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
15ee0 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
15ef0 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
15f00 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
15f10 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
15f20 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
15f30 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
15f40 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
15f50 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
15f60 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
15f70 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
15f80 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
15f90 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d  orWithMsg(db, p-
15fa0 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20  >rc, p->zErrMsg 
15fb0 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a  ? "%s" : 0, p->z
15fc0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
15fd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15fe0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15ff0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
16000 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
16010 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
16020 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
16030 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
16040 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
16050 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
16060 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
16070 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
16080 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
16090 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
160a0 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
160b0 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
160c0 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
160d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
160e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
160f0 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
16100 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
16110 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
16120 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
16130 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
16140 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
16150 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
16160 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
16170 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29     if( p->zSql )
16180 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
16190 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  , pc = 0;.      
161a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
161b0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  -- ");.        f
161c0 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e  or(i=0; (c = p->
161d0 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  zSql[i])!=0; i++
161e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
161f0 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc=='\n' ) fpri
16200 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
16210 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28  .          putc(
16220 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  c, out);.       
16230 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20     pc = c;.     
16240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16250 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc!='\n' ) fpri
16260 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
16270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
16280 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
16290 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
162a0 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20  har zHdr[100];. 
162b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
162c0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
162d0 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75  Hdr), zHdr, "%6u
162e0 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c   %12llu %8llu ",
162f0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
16300 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
16310 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
16320 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
16330 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
16340 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
16350 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
16360 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
16370 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
16380 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  tf(out, "%s", zH
16390 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
163a0 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
163b0 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
163c0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
163d0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
163e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
163f0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
16400 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a  BE_MAGIC_RESET;.
16410 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
16420 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
16430 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
16440 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
16450 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
16460 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
16470 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
16480 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
16490 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
164a0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
164b0 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
164c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
164d0 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
164e0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
164f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
16500 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
16510 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
16520 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
16530 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
16540 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
16550 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
16560 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
16570 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
16580 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
16590 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
165a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
165b0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
165c0 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
165d0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
165e0 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
165f0 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
16600 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
16610 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
16620 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
16630 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
16640 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16650 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
16660 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
16670 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
16680 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
16690 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
166a0 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
166b0 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
166c0 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
166d0 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
166e0 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
166f0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
16700 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
16710 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
16720 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
16730 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
16740 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
16750 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
16760 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
16770 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
16780 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
16790 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
167a0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
167b0 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
167c0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
167d0 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
167e0 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
167f0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
16800 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
16810 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
16820 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
16830 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
16840 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
16850 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20  AuxData(sqlite3 
16860 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70  *db, AuxData **p
16870 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  p, int iOp, int 
16880 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20  mask){.  while( 
16890 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61  *pp ){.    AuxDa
168a0 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a  ta *pAux = *pp;.
168b0 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a      if( (iOp<0).
168c0 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69       || (pAux->i
168d0 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78  Op==iOp && (pAux
168e0 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d  ->iArg>31 || !(m
168f0 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28  ask & MASKBIT32(
16900 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20  pAux->iArg)))). 
16910 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
16920 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67  case( pAux->iArg
16930 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==31 );.      if
16940 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
16950 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
16960 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
16970 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
16980 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
16990 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
169a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
169b0 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Aux);.    }else{
169c0 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78  .      pp= &pAux
169d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
169e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
169f0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
16a00 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
16a10 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
16a20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16a30 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f  nt,.** except fo
16a40 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c  r object itself,
16a50 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72   which is preser
16a60 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ved..**.** The d
16a70 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
16a80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16a90 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
16aa0 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
16ab0 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
16ac0 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
16ad0 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
16ae0 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
16af0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
16b00 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
16b10 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20  ction and frees 
16b20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  the object itsel
16b30 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
16b40 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
16b50 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
16b60 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
16b70 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
16b80 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ext;.  assert( p
16b90 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
16ba0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
16bb0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
16bc0 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
16bd0 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
16be0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
16bf0 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
16c00 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
16c10 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
16c20 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
16c30 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
16c40 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
16c50 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
16c60 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
16c70 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61  .  }.  if( p->ma
16c80 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
16c90 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65  INIT ){.    rele
16ca0 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
16cb0 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
16cc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16cd0 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b  (db, p->pVList);
16ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16cf0 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
16d00 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65  ;.  }.  vdbeFree
16d10 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
16d20 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
16d30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16d40 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
16d50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16d60 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66  b, p->zSql);.#if
16d70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16d80 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
16d90 53 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  S.  {.    int i;
16da0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16db0 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a  p->nScan; i++){.
16dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
16dd0 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16de0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
16df0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
16e00 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16e10 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
16e20 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
16e30 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
16e40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16e50 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
16e60 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16e70 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
16e80 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
16e90 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
16ea0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16eb0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
16ec0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16ed0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
16ee0 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
16ef0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
16f00 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
16f10 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
16f20 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
16f30 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
16f40 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
16f50 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
16f60 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
16f70 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
16f80 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
16f90 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
16fa0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
16fb0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
16fc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
16fd0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
16fe0 20 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20   The cursor "p" 
16ff0 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65  has a pending se
17000 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  ek operation tha
17010 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
17020 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75  en.** carried ou
17030 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72  t.  Seek the cur
17040 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20  sor now.  If an 
17050 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17060 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72  turn.** the appr
17070 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
17080 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
17090 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
170a0 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  E handleDeferred
170b0 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
170c0 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73  r *p){.  int res
170d0 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
170e0 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
170f0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
17100 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
17110 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
17120 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
17130 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
17140 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  sTable );.  asse
17150 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
17160 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
17170 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17180 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
17190 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ked(p->uc.pCurso
171a0 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
171b0 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b  arget, 0, &res);
171c0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
171d0 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73  rn rc;.  if( res
171e0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
171f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17200 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17210 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73  TEST.  sqlite3_s
17220 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
17230 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72  endif.  p->defer
17240 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
17250 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
17260 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
17270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17280 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  K;.}../*.** Some
17290 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20  thing has moved 
172a0 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f  cursor "p" out o
172b0 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20  f place.  Maybe 
172c0 74 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a  the row it was.*
172d0 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73  * pointed to was
172e0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
172f0 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20  m under it.  Or 
17300 6d 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20  maybe the btree 
17310 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65  was.** rebalance
17320 64 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65  d.  Whatever the
17330 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72   cause, try to r
17340 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68  estore "p" to th
17350 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73  e place it.** is
17360 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20   supposed to be 
17370 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68  pointing.  If th
17380 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65  e row was delete
17390 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
173a0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20   the.** cursor, 
173b0 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74  set the cursor t
173c0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c  o point to a NUL
173d0 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  L row..*/.static
173e0 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
173f0 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64  LINE handleMoved
17400 43 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f  Cursor(VdbeCurso
17410 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44  r *p){.  int isD
17420 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b  ifferentRow, rc;
17430 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
17440 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
17450 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
17460 74 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t( p->uc.pCursor
17470 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17480 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
17490 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
174a0 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  c.pCursor) );.  
174b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
174c0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70  eCursorRestore(p
174d0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69  ->uc.pCursor, &i
174e0 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a  sDifferentRow);.
174f0 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
17500 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
17510 20 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e    if( isDifferen
17520 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f  tRow ) p->nullRo
17530 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  w = 1;.  return 
17540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
17550 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ck to ensure tha
17560 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
17570 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20  valid.  Restore 
17580 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66  the cursor.** if
17590 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72   need be.  Retur
175a0 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20  n any I/O error 
175b0 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65  from the restore
175c0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69   operation..*/.i
175d0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
175e0 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65  rsorRestore(Vdbe
175f0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73  Cursor *p){.  as
17600 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
17610 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
17620 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
17630 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
17640 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
17650 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
17660 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
17670 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
17680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17690 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
176a0 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
176b0 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
176c0 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
176d0 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
176e0 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
176f0 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
17700 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
17710 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
17720 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
17730 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
17740 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
17750 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
17760 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
17770 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
17780 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
17790 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
177a0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
177b0 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
177c0 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
177d0 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
177e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
177f0 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
17800 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
17810 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
17820 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
17830 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
17840 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
17850 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
17860 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
17870 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
17880 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
17890 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
178a0 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
178b0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
178c0 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
178d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
178e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
178f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
17900 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
17910 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70  sor **pp, int *p
17920 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72  iCol){.  VdbeCur
17930 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  sor *p = *pp;.  
17940 69 66 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  if( p->eCurType=
17950 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
17960 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66  {.    if( p->def
17970 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
17980 20 20 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20       int iMap;. 
17990 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74       if( p->aAlt
179a0 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70  Map && (iMap = p
179b0 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43  ->aAltMap[1+*piC
179c0 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  ol])>0 ){.      
179d0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
179e0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a  ursor;.        *
179f0 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31  piCol = iMap - 1
17a00 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
17a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17a20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
17a30 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
17a40 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a  oveto(p);.    }.
17a50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
17a60 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
17a70 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
17a80 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
17a90 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
17aa0 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  sor(p);.    }.  
17ab0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17ac0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17ad0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
17ae0 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
17af0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17b00 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
17b10 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
17b20 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
17b30 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
17b40 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17b50 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
17b60 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17b70 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
17b80 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
17b90 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
17ba0 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
17bb0 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
17bc0 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
17bd0 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
17be0 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
17bf0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
17c00 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
17c10 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
17c20 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
17c30 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
17c40 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
17c50 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
17c60 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
17c70 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
17c80 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
17c90 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
17ca0 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
17cb0 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
17cc0 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
17cd0 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
17ce0 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
17cf0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
17d00 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
17d10 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
17d20 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
17d30 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
17d40 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
17d50 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
17d60 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
17d70 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
17d80 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
17d90 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
17da0 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
17db0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17dc0 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
17dd0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
17de0 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
17df0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
17e00 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
17e10 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
17e20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
17e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
17e40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17e50 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
17e60 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
17e90 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
17ec0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17ed0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
17ef0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17f00 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17f10 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
17f20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
17f30 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17f40 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
17f70 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17f80 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
17f90 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
17fa0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17fb0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17fe0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17ff0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
18010 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
18020 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
18050 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
18060 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
18090 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
180a0 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
180d0 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
180e0 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
180f0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
18100 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
18110 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
18120 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
18130 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
18140 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
18150 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
18160 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
18170 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
18180 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
18190 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
181a0 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
181b0 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
181c0 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
181d0 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
181e0 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
181f0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
18200 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
18210 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18220 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
18230 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32  file_format, u32
18240 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66   *pLen){.  int f
18250 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
18260 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  gs;.  u32 n;..  
18270 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20  assert( pLen!=0 
18280 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  );.  if( flags&M
18290 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a  EM_Null ){.    *
182a0 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65  pLen = 0;.    re
182b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
182c0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
182d0 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
182e0 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
182f0 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
18300 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
18310 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
18320 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
18330 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
18340 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
18350 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
18360 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
18370 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20        u = ~i;.  
18380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
18390 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
183a0 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
183b0 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69      if( (i&1)==i
183c0 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
183d0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =4 ){.        *p
183e0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Len = 0;.       
183f0 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75   return 8+(u32)u
18400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18410 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31         *pLen = 1
18420 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
18430 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18440 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
18450 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b  67 ){ *pLen = 2;
18460 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20   return 2; }.   
18470 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
18480 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65  ){ *pLen = 3; re
18490 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66  turn 3; }.    if
184a0 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
184b0 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65  ){ *pLen = 4; re
184c0 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66  turn 4; }.    if
184d0 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
184e0 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74  { *pLen = 6; ret
184f0 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c  urn 5; }.    *pL
18500 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
18510 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
18520 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
18530 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b  {.    *pLen = 8;
18540 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
18550 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
18560 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
18570 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
18580 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
18590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
185a0 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
185b0 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
185c0 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
185d0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
185e0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
185f0 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e  .  }.  *pLen = n
18600 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
18610 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
18620 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
18630 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  }../*.** The siz
18640 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79  es for serial ty
18650 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32  pes less than 12
18660 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  8.*/.static cons
18670 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c  t u8 sqlite3Smal
18680 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b  lTypeSizes[] = {
18690 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20  .        /*  0  
186a0 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20   1   2   3   4  
186b0 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20   5   6   7   8  
186c0 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20   9 */   ./*   0 
186d0 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20  */   0,  1,  2, 
186e0 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20   3,  4,  6,  8, 
186f0 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20   8,  0,  0,./*  
18700 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  10 */   0,  0,  
18710 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
18720 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f  2,  2,  3,  3,./
18730 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34  *  20 */   4,  4
18740 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36  ,  5,  5,  6,  6
18750 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38  ,  7,  7,  8,  8
18760 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c  ,./*  30 */   9,
18770 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c    9, 10, 10, 11,
18780 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c   11, 12, 12, 13,
18790 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20   13,./*  40 */  
187a0 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20  14, 14, 15, 15, 
187b0 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20  16, 16, 17, 17, 
187c0 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a  18, 18,./*  50 *
187d0 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32  /  19, 19, 20, 2
187e0 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32  0, 21, 21, 22, 2
187f0 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36  2, 23, 23,./*  6
18800 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35  0 */  24, 24, 25
18810 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37  , 25, 26, 26, 27
18820 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a  , 27, 28, 28,./*
18830 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c    70 */  29, 29,
18840 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c   30, 30, 31, 31,
18850 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c   32, 32, 33, 33,
18860 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20  ./*  80 */  34, 
18870 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20  34, 35, 35, 36, 
18880 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20  36, 37, 37, 38, 
18890 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33  38,./*  90 */  3
188a0 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34  9, 39, 40, 40, 4
188b0 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34  1, 41, 42, 42, 4
188c0 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f  3, 43,./* 100 */
188d0 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35    44, 44, 45, 45
188e0 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37  , 46, 46, 47, 47
188f0 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30  , 48, 48,./* 110
18900 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c   */  49, 49, 50,
18910 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c   50, 51, 51, 52,
18920 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20   52, 53, 53,./* 
18930 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20  120 */  54, 54, 
18940 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20  55, 55, 56, 56, 
18950 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  57, 57.};../*.**
18960 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
18970 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
18980 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
18990 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
189a0 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
189b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
189c0 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
189d0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
189e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
189f0 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  28 ){.    return
18a00 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
18a10 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
18a20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
18a30 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20  _type<12 .      
18a40 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
18a50 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
18a60 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65  erial_type]==(se
18a70 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f  rial_type - 12)/
18a80 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 );.    return 
18a90 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18aa0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
18ab0 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c  e];.  }.}.u8 sql
18ac0 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53  ite3VdbeOneByteS
18ad0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20  erialTypeLen(u8 
18ae0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
18af0 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
18b00 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74  ype<128 );.  ret
18b10 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
18b20 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
18b30 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a  _type];  .}../*.
18b40 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
18b50 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
18b60 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
18b70 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
18b80 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
18b90 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
18ba0 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
18bb0 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
18bc0 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
18bd0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
18be0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
18bf0 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
18c00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
18c10 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
18c20 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
18c30 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
18c40 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
18c50 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
18c60 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
18c70 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
18c80 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
18c90 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
18ca0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
18cb0 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
18cc0 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
18cd0 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
18ce0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
18cf0 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
18d00 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
18d10 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
18d20 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
18d30 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
18d40 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
18d50 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
18d60 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
18d70 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
18d80 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
18d90 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
18da0 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
18db0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
18dc0 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
18dd0 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
18de0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
18df0 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
18e00 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
18e10 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
18e20 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
18e30 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
18e40 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
18e50 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
18e60 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
18e70 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
18e80 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
18e90 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
18ea0 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
18eb0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
18ec0 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
18ed0 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
18ee0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
18ef0 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
18f00 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
18f10 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
18f20 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
18f30 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
18f40 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
18f50 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
18f60 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
18f70 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
18f80 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
18f90 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18fa0 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
18fb0 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
18fc0 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
18fd0 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
18fe0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
18ff0 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
19000 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
19010 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
19020 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
19030 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
19040 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
19050 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
19060 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
19070 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
19080 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
19090 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
190a0 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
190b0 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
190c0 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
190d0 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
190e0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
190f0 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
19100 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
19110 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
19120 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
19130 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
19140 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
19150 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
19160 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
19170 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
19180 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
19190 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
191a0 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
191b0 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
191c0 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
191d0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
191e0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
191f0 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
19200 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
19210 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
19220 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
19230 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
19240 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
19250 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
19260 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
19270 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
19280 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
19290 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
192a0 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
192b0 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
192c0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
192d0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
192e0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
192f0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
19300 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
19310 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
19320 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
19330 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
19340 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
19350 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
19360 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
19370 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
19380 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19390 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
193a0 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
193b0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
193c0 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
193d0 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
193e0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
193f0 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
19400 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
19410 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
19420 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
19430 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
19440 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
19450 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
19460 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
19470 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19480 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19490 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
194a0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
194b0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
194c0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
194d0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
194e0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
194f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
19500 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
19510 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
19520 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
19530 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
19540 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
19550 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
19560 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
19570 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
19580 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
19590 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
195a0 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
195b0 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
195c0 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
195d0 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
195e0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
195f0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
19600 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
19610 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
19620 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
19630 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
19640 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
19650 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
19660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19670 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
19680 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
19690 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c   i = sqlite3Smal
196a0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
196b0 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73  l_type];.    ass
196c0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
196d0 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
196e0 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
196f0 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
19700 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
19710 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
19720 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
19730 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
19740 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
19750 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
19760 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
19770 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
19780 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
19790 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
197a0 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
197b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
197c0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
197d0 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
197e0 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66   pMem->n;.    if
197f0 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79  ( len>0 ) memcpy
19800 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
19810 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
19820 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
19830 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
19840 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
19850 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70  urn 0;.}../* Inp
19860 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75  ut "x" is a sequ
19870 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64  ence of unsigned
19880 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
19890 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20   represent a.** 
198a0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
198b0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
198c0 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76  equivalent nativ
198d0 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65  e integer.*/.#de
198e0 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  fine ONE_BYTE_IN
198f0 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29  T(x)    ((i8)(x)
19900 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f  [0]).#define TWO
19910 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
19920 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  (256*(i8)((x)[0]
19930 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e  )|(x)[1]).#defin
19940 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  e THREE_BYTE_INT
19950 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29  (x)  (65536*(i8)
19960 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
19970 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65  <<8)|(x)[2]).#de
19980 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55  fine FOUR_BYTE_U
19990 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28  INT(x)  (((u32)(
199a0 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b  x)[0]<<24)|((x)[
199b0 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
199c0 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66  <8)|(x)[3]).#def
199d0 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  ine FOUR_BYTE_IN
199e0 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28  T(x) (16777216*(
199f0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
19a00 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
19a10 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a  <<8)|(x)[3])../*
19a20 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
19a30 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
19a40 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
19a50 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
19a60 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
19a70 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
19a80 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
19a90 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19aa0 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a  f bytes read..**
19ab0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19ac0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
19ad0 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65   as two separate
19ae0 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65   routines for pe
19af0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
19b00 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74  e few cases that
19b10 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76   require local v
19b20 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f  ariables are bro
19b30 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73  ken out into a s
19b40 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69  eparate.** routi
19b50 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f  ne so that in mo
19b60 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65  st cases the ove
19b70 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20  rhead of moving 
19b80 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  the stack pointe
19b90 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e  r.** is avoided.
19ba0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20  .*/ .static u32 
19bb0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
19bc0 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  serialGet(.  con
19bd0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19be0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
19bf0 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
19c00 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
19c10 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19c30 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
19c40 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
19c50 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c70 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
19c80 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
19c90 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20  */.){.  u64 x = 
19ca0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
19cb0 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46  uf);.  u32 y = F
19cc0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
19cd0 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c  f+4);.  x = (x<<
19ce0 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73  32) + y;.  if( s
19cf0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
19d00 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19d10 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32  -OF: R-29851-522
19d20 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  72 Value is a bi
19d30 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a  g-endian 64-bit.
19d40 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
19d50 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
19d60 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  */.    pMem->u.i
19d70 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
19d80 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19d90 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73  MEM_Int;.    tes
19da0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19db0 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  <0 );.  }else{. 
19dc0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19dd0 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34  F: R-57343-49114
19de0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19df0 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d  endian IEEE 754-
19e00 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20  2008 64-bit.    
19e10 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
19e20 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66  t number. */.#if
19e30 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
19e40 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
19e50 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
19e60 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a  NG_POINT).    /*
19e70 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
19e80 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
19e90 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
19ea0 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
19eb0 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
19ec0 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
19ed0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
19ee0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
19ef0 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
19f00 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
19f10 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
19f20 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
19f30 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e  d.    ** endian.
19f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
19f50 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
19f60 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
19f70 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61  00)<<32;.    sta
19f80 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
19f90 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75   r1 = 1.0;.    u
19fa0 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
19fb0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19fc0 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73  loat(t2);.    as
19fd0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
19fe0 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
19ff0 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
1a000 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
1a010 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
1a020 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
1a030 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
1a040 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20  m->u.r)==8 );.  
1a050 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1a060 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d  nFloat(x);.    m
1a070 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72  emcpy(&pMem->u.r
1a080 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
1a090 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
1a0a0 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
1a0b0 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45  (pMem->u.r) ? ME
1a0c0 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
1a0d0 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
1a0e0 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  8;.}.u32 sqlite3
1a0f0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
1a100 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1a110 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
1a120 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
1a130 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
1a140 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1a150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a160 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
1a170 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
1a180 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
1a1b0 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
1a1c0 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
1a1d0 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1a1e0 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
1a1f0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
1a200 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
1a210 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
1a220 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
1a230 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
1a240 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
1a250 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ull */.      /* 
1a260 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a270 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65  4078-09375 Value
1a280 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20   is a NULL. */. 
1a290 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a2a0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
1a2b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a2c0 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
1a2d0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a2e0 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39  OF: R-44885-2519
1a2f0 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d  6 Value is an 8-
1a300 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d  bit twos-complem
1a310 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ent.      ** int
1a320 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1a330 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
1a340 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a350 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a360 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a370 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a380 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a390 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1a3a0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1a3b0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1a3c0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1a3d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a3e0 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61  R-49794-35026 Va
1a3f0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a400 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20  ian 16-bit.     
1a410 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1a420 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1a430 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a440 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
1a450 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1a460 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a470 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a480 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
1a4a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a4b0 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
1a4c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a4d0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a4e0 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35  CE-OF: R-37839-5
1a4f0 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20  4301 Value is a 
1a500 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69  big-endian 24-bi
1a510 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1a520 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1a530 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a540 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
1a550 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a560 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a570 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a580 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a590 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a5a0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
1a5b0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1a5c0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1a5d0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1a5e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a5f0 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61  R-01849-26079 Va
1a600 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a610 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20  ian 32-bit.     
1a620 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1a630 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1a640 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a650 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
1a660 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48  buf);.#ifdef __H
1a670 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57  P_cc .      /* W
1a680 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67  ork around a sig
1a690 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20  n-extension bug 
1a6a0 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c  in the HP compil
1a6b0 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a  er for HP/UX */.
1a6c0 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
1a6d0 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e  &0x80 ) pMem->u.
1a6e0 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38  i |= 0xffffffff8
1a6f0 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69  0000000LL;.#endi
1a700 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  f.      pMem->fl
1a710 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1a720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1a730 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1a740 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
1a750 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1a760 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1a770 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1a780 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a790 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37  OF: R-50385-0967
1a7a0 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1a7b0 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20  -endian 48-bit. 
1a7c0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1a7d0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1a7e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1a7f0 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1a800 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
1a810 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1a820 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1a830 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a840 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1a850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1a860 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1a870 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
1a880 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
1a890 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1a8a0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1a8b0 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
1a8c0 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
1a8d0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   */.      /* The
1a8e0 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72  se use local var
1a8f0 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68  iables, so do th
1a900 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  em in a separate
1a910 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a   routine.      *
1a920 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  * to avoid havin
1a930 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72  g to move the fr
1a940 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ame pointer in t
1a950 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
1a960 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  /.      return s
1a970 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72  erialGet(buf,ser
1a980 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a  ial_type,pMem);.
1a990 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
1a9a0 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
1a9b0 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
1a9c0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
1a9d0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a9e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37  DENCE-OF: R-1297
1a9f0 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73  6-22893 Value is
1aa00 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20   the integer 0. 
1aa10 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1aa20 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33  ENCE-OF: R-18143
1aa30 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20  -12121 Value is 
1aa40 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a  the integer 1. *
1aa50 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1aa60 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
1aa70 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
1aa80 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1aa90 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1aaa0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1aab0 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t: {.      /* EV
1aac0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36  IDENCE-OF: R-146
1aad0 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69  06-31564 Value i
1aae0 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73  s a BLOB that is
1aaf0 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20   (N-12)/2 bytes 
1ab00 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67  in.      ** leng
1ab10 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49  th..      ** EVI
1ab20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30  DENCE-OF: R-2840
1ab30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73  1-00140 Value is
1ab40 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65   a string in the
1ab50 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
1ab60 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31  nd.      ** (N-1
1ab70 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65  3)/2 bytes in le
1ab80 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ngth. */.      s
1ab90 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
1aba0 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
1abb0 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20  Blob|MEM_Ephem, 
1abc0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65  MEM_Str|MEM_Ephe
1abd0 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  m };.      pMem-
1abe0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
1abf0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1ac00 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1ac10 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
1ac20 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
1ac30 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
1ac40 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65        return pMe
1ac50 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m->n;.    }.  }.
1ac60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a    return 0;.}./*
1ac70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ac80 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
1ac90 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
1aca0 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
1acb0 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
1acc0 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
1acd0 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
1ace0 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
1acf0 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
1ad00 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
1ad10 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1ad20 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
1ad30 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
1ad40 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
1ad50 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
1ad60 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
1ad70 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1ad80 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
1ad90 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
1ada0 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
1adb0 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
1adc0 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
1add0 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
1ade0 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
1adf0 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
1ae00 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
1ae10 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
1ae20 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
1ae30 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
1ae40 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1ae50 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1ae60 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
1ae70 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
1ae80 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
1ae90 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
1aea0 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
1aeb0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1aec0 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
1aed0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1aee0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1aef0 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
1af00 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
1af10 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
1af20 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1af30 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
1af40 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1af50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1af60 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1af70 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
1af80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1af90 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1afa0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
1afb0 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
1afc0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1aff0 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
1b000 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20  r *p */.  nByte 
1b010 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1b020 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1b030 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
1b040 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b050 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61  +1);.  p = (Unpa
1b060 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c  ckedRecord *)sql
1b070 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1b080 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
1b090 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29  yte);.  if( !p )
1b0a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e   return 0;.  p->
1b0b0 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28  aMem = (Mem*)&((
1b0c0 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28  char*)p)[ROUND8(
1b0d0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
1b0e0 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65  ecord))];.  asse
1b0f0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
1b100 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1b110 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
1b120 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
1b130 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
1b140 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72  >nField + 1;.  r
1b150 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1b160 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79  * Given the nKey
1b170 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f  -byte encoding o
1b180 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b  f a record in pK
1b190 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74  ey[], populate t
1b1a0 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52  he .** UnpackedR
1b1b0 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
1b1c0 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1b1d0 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
1b1e0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e   with the.** con
1b1f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63  tents of the dec
1b200 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20  oded record..*/ 
1b210 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1b220 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20  eRecordUnpack(. 
1b230 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1b240 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  fo,     /* Infor
1b250 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1b260 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a   record format *
1b270 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20  /.  int nKey,   
1b280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b290 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79  ze of the binary
1b2a0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
1b2b0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
1b2c0 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72      /* The binar
1b2d0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e  y record */.  Un
1b2e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20  packedRecord *p 
1b2f0 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
1b300 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1b310 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1b320 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  . */.){.  const 
1b330 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1b340 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
1b350 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1b360 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75  y;.  int d; .  u
1b370 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  32 idx;         
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b390 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79  * Offset in aKey
1b3a0 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  [] to read from 
1b3b0 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20  */.  u16 u;     
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3d0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1b3e0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1b3f0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
1b400 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *pMem = p->a
1b410 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75  Mem;..  p->defau
1b420 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  lt_rc = 0;.  ass
1b430 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
1b440 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
1b450 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  );.  idx = getVa
1b460 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1b470 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72  dr);.  d = szHdr
1b480 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  u = 0;.  whi
1b490 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26  le( idx<szHdr &&
1b4a0 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
1b4b0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
1b4c0 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
1b4d0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
1b4e0 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
1b4f0 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
1b500 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1b510 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
1b520 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1b530 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67     /* pMem->flag
1b540 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65  s = 0; // sqlite
1b550 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1b560 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66   will set this f
1b570 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65  or us */.    pMe
1b580 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m->szMalloc = 0;
1b590 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30  .    pMem->z = 0
1b5a0 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
1b5b0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b5c0 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
1b5d0 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
1b5e0 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66    pMem++;.    if
1b5f0 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65  ( (++u)>=p->nFie
1b600 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ld ) break;.  }.
1b610 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
1b620 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1b630 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
1b640 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   = u;.}..#ifdef 
1b650 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1b660 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b670 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
1b680 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
1b690 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
1b6a0 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1b6b0 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1b6c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1b6d0 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1b6e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1b6f0 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1b700 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1b710 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1b720 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1b730 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1b740 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1b750 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1b760 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1b770 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1b780 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b790 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1b7a0 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1b7b0 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1b7c0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b7d0 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1b7e0 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1b7f0 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1b800 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1b810 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1b820 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1b830 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1b840 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1b850 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1b860 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1b870 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1b880 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1b890 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1b8a0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1b8b0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1b8c0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1b8d0 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1b8e0 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1b8f0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1b900 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1b910 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1b920 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1b930 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1b940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1b950 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1b960 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1b970 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1b980 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1b990 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1b9a0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1b9b0 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1b9c0 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1b9d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b9e0 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1b9f0 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1ba00 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1ba10 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ba20 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1ba30 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1ba40 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1ba50 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1ba60 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1ba70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1ba80 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1ba90 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1baa0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1bab0 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1bac0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1bad0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1bae0 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1baf0 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1bb00 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1bb10 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1bb20 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1bb30 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1bb40 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1bb50 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1bb60 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1bb70 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1bb80 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1bb90 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1bba0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1bbb0 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1bbc0 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1bbd0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1bbe0 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1bbf0 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1bc00 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1bc10 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1bc20 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1bc30 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1bc40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1bc50 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1bc60 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1bc70 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1bc80 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1bc90 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1bca0 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1bcb0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1bcc0 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1bcd0 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1bce0 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1bcf0 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1bd00 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1bd10 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1bd20 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1bd30 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1bd40 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1bd50 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1bd60 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1bd70 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1bd80 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1bd90 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1bda0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1bdb0 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1bdc0 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1bdd0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1bde0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1bdf0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1be00 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1be10 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1be20 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1be30 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1be40 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1be50 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1be60 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1be70 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1be80 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1be90 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1bea0 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1beb0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1bec0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1bed0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1bee0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1bef0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1bf00 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1bf10 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1bf20 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1bf30 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1bf40 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1bf50 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1bf60 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1bf70 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1bf80 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1bf90 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1bfa0 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1bfb0 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1bfc0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1bfd0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1bfe0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1bff0 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1c000 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1c010 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1c020 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1c030 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1c040 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1c050 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1c060 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1c070 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1c080 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1c090 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
1c0a0 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
1c0b0 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
1c0c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1c0d0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1c0e0 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
1c0f0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1c100 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c110 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1c120 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1c130 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1c140 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1c150 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1c160 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1c170 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1c180 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1c190 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1c1a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1c1b0 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1c1c0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1c1d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1c1e0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
1c1f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1c200 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c210 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1c220 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1c230 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
1c240 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1c250 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1c260 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
1c270 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
1c280 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
1c290 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
1c2a0 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
1c2b0 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
1c2c0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
1c2d0 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
1c2e0 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1c2f0 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
1c300 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1c310 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1c320 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1c330 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1c340 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1c350 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1c360 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1c370 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1c380 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1c390 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1c3a0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1c3b0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1c3c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1c3d0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1c3e0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1c3f0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1c400 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
1c410 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1c420 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1c430 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1c440 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1c450 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1c460 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1c470 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
1c480 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1c490 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
1c4a0 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
1c4b0 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
1c4c0 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
1c4d0 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1c4e0 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
1c4f0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
1c500 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c510 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
1c520 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
1c530 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1c540 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
1c550 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1c560 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1c570 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
1c580 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1c590 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1c5a0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1c5b0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61  ber of fields (a
1c5c0 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69  .k.a. columns) i
1c5d0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  n the record giv
1c5e0 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b  en by.** pKey,nK
1c5f0 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20  ey.  The verify 
1c600 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20  that this count 
1c610 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1c620 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20  equal to the.** 
1c630 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70  limit given by p
1c640 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1c650 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  + pKeyInfo->nXFi
1c660 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1c670 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1c680 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1c690 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1c6a0 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1c6b0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1c6c0 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1c6d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1c6e0 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1c6f0 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1c700 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1c710 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1c720 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1c730 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1c740 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46  t the KeyInfo.nF
1c750 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1c760 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77  nXField values w
1c770 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20  ere computed.** 
1c780 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  incorrectly..*/.
1c790 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
1c7a0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1c7b0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20  WithinLimits(.  
1c7c0 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20  int nKey, const 
1c7d0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1c7e0 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76   The record to v
1c7f0 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73  erify */ .  cons
1c800 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1c810 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  nfo       /* Com
1c820 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74  pare size with t
1c830 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29  his KeyInfo */.)
1c840 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d  {.  int nField =
1c850 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   0;.  u32 szHdr;
1c860 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33  .  u32 idx;.  u3
1c870 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e  2 notUsed;.  con
1c880 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1c890 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1c8a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1c8b0 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52  Key;..  if( CORR
1c8c0 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
1c8d0 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1c8e0 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1c8f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
1c900 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
1c910 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b  ( szHdr<=(u32)nK
1c920 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ey );.  while( i
1c930 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20  dx<szHdr ){.    
1c940 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1c950 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74  32(aKey+idx, not
1c960 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c  Used);.    nFiel
1c970 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  d++;.  }.  asser
1c980 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65  t( nField <= pKe
1c990 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
1c9a0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20  eyInfo->nXField 
1c9b0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
1c9c0 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69  ine vdbeAssertFi
1c9d0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1c9e0 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64  mits(A,B,C).#end
1c9f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
1ca00 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
1ca10 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
1ca20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
1ca30 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
1ca40 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
1ca50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
1ca60 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
1ca70 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
1ca80 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
1ca90 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
1caa0 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
1cab0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1cac0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
1cad0 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
1cae0 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
1caf0 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
1cb00 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
1cb10 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
1cb20 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
1cb30 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1cb40 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1cb50 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
1cb60 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
1cb70 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20  ollSeq *pColl,. 
1cb80 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20   u8 *prcErr     
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63   /* If an OOM oc
1cbb0 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c  curs, set to SQL
1cbc0 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a  ITE_NOMEM */.){.
1cbd0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63    if( pMem1->enc
1cbe0 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
1cbf0 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
1cc00 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  gs are already i
1cc10 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e  n the correct en
1cc20 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68  coding.  Call th
1cc30 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e.     ** compar
1cc40 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69  ison function di
1cc50 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65  rectly */.    re
1cc60 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  turn pColl->xCmp
1cc70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d  (pColl->pUser,pM
1cc80 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c  em1->n,pMem1->z,
1cc90 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e  pMem2->n,pMem2->
1cca0 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1ccb0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e   int rc;.    con
1ccc0 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32  st void *v1, *v2
1ccd0 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32  ;.    int n1, n2
1cce0 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20  ;.    Mem c1;.  
1ccf0 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71    Mem c2;.    sq
1cd00 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1cd10 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c1, pMem1->db,
1cd20 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1cd30 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1cd40 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c2, pMem1->d
1cd50 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1cd60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cd70 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c  ShallowCopy(&c1,
1cd80 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65   pMem1, MEM_Ephe
1cd90 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
1cda0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1cdb0 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45  y(&c2, pMem2, ME
1cdc0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31  M_Ephem);.    v1
1cdd0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1cde0 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1cdf0 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c1, pColl->
1ce00 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76  enc);.    n1 = v
1ce10 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b  1==0 ? 0 : c1.n;
1ce20 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65  .    v2 = sqlite
1ce30 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1ce40 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20  te3_value*)&c2, 
1ce50 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1ce60 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20   n2 = v2==0 ? 0 
1ce70 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d  : c2.n;.    rc =
1ce80 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1ce90 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76  ll->pUser, n1, v
1cea0 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20  1, n2, v2);.    
1ceb0 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32  if( (v1==0 || v2
1cec0 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29  ==0) && prcErr )
1ced0 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54   *prcErr = SQLIT
1cee0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1cef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cf00 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
1cf10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cf20 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
1cf30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1cf40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  .}../*.** The in
1cf50 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61  put pBlob is gua
1cf60 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
1cf70 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74  Blob that is not
1cf80 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20   marked.** with 
1cf90 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72  MEM_Zero.  Retur
1cfa0 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75  n true if it cou
1cfb0 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f  ld be a zero-blo
1cfc0 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
1cfd0 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74   isAllZero(const
1cfe0 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
1cff0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1d000 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
1d010 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20  .    if( z[i] ) 
1d020 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1d030 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
1d040 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
1d050 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
1d060 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1d070 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1d080 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
1d090 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1d0a0 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1d0b0 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
1d0c0 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
1d0d0 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
1d0e0 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
1d0f0 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
1d100 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
1d110 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  sor..*/.static S
1d120 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
1d130 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
1d140 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1d150 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
1d160 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  *pB2){.  int c;.
1d170 20 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e    int n1 = pB1->
1d180 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42  n;.  int n2 = pB
1d190 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  2->n;..  /* It i
1d1a0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61  s possible to ha
1d1b0 76 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20  ve a Blob value 
1d1c0 74 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f  that has some no
1d1d0 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20  n-zero content. 
1d1e0 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1d1f0 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42  zero content.  B
1d200 75 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d  ut that only com
1d210 65 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20  es up for Blobs 
1d220 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74  formed.  ** by t
1d230 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1d240 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63   opcode, and suc
1d250 68 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65  h Blobs never ge
1d260 74 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  t passed into.  
1d270 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  ** sqlite3MemCom
1d280 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73  pare(). */.  ass
1d290 65 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73  ert( (pB1->flags
1d2a0 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1d2b0 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73  || n1==0 );.  as
1d2c0 73 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67  sert( (pB2->flag
1d2d0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1d2e0 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20   || n2==0 );..  
1d2f0 69 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c  if( (pB1->flags|
1d300 70 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45  pB2->flags) & ME
1d310 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66  M_Zero ){.    if
1d320 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70  ( pB1->flags & p
1d330 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B2->flags & MEM_
1d340 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65  Zero ){.      re
1d350 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72  turn pB1->u.nZer
1d360 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f  o - pB2->u.nZero
1d370 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d380 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB1->flags & MEM
1d390 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69  _Zero ){.      i
1d3a0 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42  f( !isAllZero(pB
1d3b0 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20  2->z, pB2->n) ) 
1d3c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1d3d0 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e   return pB1->u.n
1d3e0 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d  Zero - n2;.    }
1d3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1d400 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e  !isAllZero(pB1->
1d410 7a 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74  z, pB1->n) ) ret
1d420 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1d430 74 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75  turn n1 - pB2->u
1d440 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20  .nZero;.    }.  
1d450 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  }.  c = memcmp(p
1d460 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e  B1->z, pB2->z, n
1d470 31 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b  1>n2 ? n2 : n1);
1d480 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72  .  if( c ) retur
1d490 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31  n c;.  return n1
1d4a0 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - n2;.}../*.** 
1d4b0 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  Do a comparison 
1d4c0 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74  between a 64-bit
1d4d0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1d4e0 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  and a 64-bit flo
1d4f0 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e  ating-point.** n
1d500 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e  umber.  Return n
1d510 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1d520 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1d530 65 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73  e first (i64) is
1d540 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65   less than,.** e
1d550 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1d560 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1d570 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f  ond (double)..*/
1d580 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
1d590 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1d5a0 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65  re(i64 i, double
1d5b0 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f   r){.  if( sizeo
1d5c0 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50  f(LONGDOUBLE_TYP
1d5d0 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47  E)>8 ){.    LONG
1d5e0 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20  DOUBLE_TYPE x = 
1d5f0 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1d600 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20  )i;.    if( x<r 
1d610 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d620 20 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72   if( x>r ) retur
1d630 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1d640 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d650 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62   i64 y;.    doub
1d660 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c  le s;.    if( r<
1d670 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
1d680 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20  5808.0 ) return 
1d690 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32  +1;.    if( r>92
1d6a0 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1d6b0 37 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  7.0 ) return -1;
1d6c0 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b  .    y = (i64)r;
1d6d0 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72  .    if( i<y ) r
1d6e0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1d6f0 28 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69  ( i>y ){.      i
1d700 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  f( y==SMALLEST_I
1d710 4e 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20  NT64 && r>0.0 ) 
1d720 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1d730 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d740 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c  }.    s = (doubl
1d750 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72  e)i;.    if( s<r
1d760 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d770 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75    if( s>r ) retu
1d780 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  rn +1;.    retur
1d790 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
1d7a0 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
1d7b0 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
1d7c0 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
1d7d0 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
1d7e0 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
1d7f0 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
1d800 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
1d810 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1d820 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
1d830 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
1d840 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
1d850 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
1d860 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
1d870 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
1d880 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
1d890 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
1d8a0 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
1d8b0 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
1d8c0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
1d8d0 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
1d8e0 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
1d8f0 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
1d900 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
1d910 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1d920 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
1d930 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1d940 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
1d950 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1d960 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
1d970 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
1d980 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
1d990 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69   int f1, f2;.  i
1d9a0 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  nt combined_flag
1d9b0 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31  s;..  f1 = pMem1
1d9c0 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20  ->flags;.  f2 = 
1d9d0 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem2->flags;.  
1d9e0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d  combined_flags =
1d9f0 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74   f1|f2;.  assert
1da00 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  ( (combined_flag
1da10 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
1da20 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20  =0 );. .  /* If 
1da30 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  one value is NUL
1da40 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  L, it is less th
1da50 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66  an the other. If
1da60 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a   both values.  *
1da70 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75  * are NULL, retu
1da80 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
1da90 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1daa0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1dab0 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e  return (f2&MEM_N
1dac0 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e  ull) - (f1&MEM_N
1dad0 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ull);.  }..  /* 
1dae0 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  At least one of 
1daf0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69  the two values i
1db00 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a  s a number.  */.
1db10 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1db20 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  lags&(MEM_Int|ME
1db30 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69  M_Real) ){.    i
1db40 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1db50 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1db60 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1db70 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
1db80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1db90 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1dba0 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
1dbb0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1dbc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1dbd0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1dbe0 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  2 & MEM_Real)!=0
1dbf0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1dc00 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32  em1->u.r < pMem2
1dc10 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d  ->u.r ) return -
1dc20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1dc30 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d  m1->u.r > pMem2-
1dc40 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.r ) return +1
1dc50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1dc60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1dc70 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f1&MEM_Int)!=0 
1dc80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1dc90 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1dca0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dcb0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1dcc0 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e  ompare(pMem1->u.
1dcd0 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a  i, pMem2->u.r);.
1dce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dcf0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1dd00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1dd10 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65    if( (f1&MEM_Re
1dd20 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1dd30 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29  if( (f2&MEM_Int)
1dd40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1dd50 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e  eturn -sqlite3In
1dd60 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1dd70 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d  em2->u.i, pMem1-
1dd80 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1dd90 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1dda0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1ddb0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1ddc0 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  +1;.  }..  /* If
1ddd0 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
1dde0 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f  string and the o
1ddf0 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20  ther is a blob, 
1de00 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65  the string is le
1de10 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
1de20 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f   are strings, co
1de30 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  mpare using the 
1de40 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
1de50 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
1de60 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1de70 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66  EM_Str ){.    if
1de80 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f1 & MEM_Str)
1de90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1dea0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1deb0 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53   if( (f2 & MEM_S
1dec0 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
1ded0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1dee0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ..    assert( pM
1def0 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d  em1->enc==pMem2-
1df00 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64  >enc || pMem1->d
1df10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1df20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1df30 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1df40 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
1df50 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
1df60 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
1df70 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
1df80 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
1df90 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
1dfa0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1dfb0 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
1dfc0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
1dfd0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
1dfe0 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
1dff0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1e000 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
1e010 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
1e020 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
1e030 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
1e040 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
1e050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1e060 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
1e070 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
1e080 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
1e090 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
1e0a0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1e0b0 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
1e0c0 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pColl, 0);.    }
1e0d0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
1e0e0 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
1e0f0 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
1e100 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
1e110 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
1e120 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
1e130 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
1e140 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
1e150 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
1e160 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
1e170 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
1e180 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65  mcmp().  */.  re
1e190 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62  turn sqlite3Blob
1e1a0 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70  Compare(pMem1, p
1e1b0 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Mem2);.}.../*.**
1e1c0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1e1d0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
1e1e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e1f0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61   serial-type tha
1e200 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  t.** corresponds
1e210 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   to an integer -
1e220 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77   all values betw
1e230 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c  een 1 and 9 incl
1e240 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74  usive .** except
1e250 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70   7. The second p
1e260 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
1e270 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
1e280 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a  integer value.**
1e290 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f   serialized acco
1e2a0 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f  rding to serial_
1e2b0 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74  type. This funct
1e2c0 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1e2d0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20  .** and returns 
1e2e0 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  the value..*/.st
1e2f0 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63  atic i64 vdbeRec
1e300 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32  ordDecodeInt(u32
1e310 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f   serial_type, co
1e320 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
1e330 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74   u32 y;.  assert
1e340 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
1e350 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20  (serial_type>=1 
1e360 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  && serial_type<=
1e370 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  9 && serial_type
1e380 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68  !=7) );.  switch
1e390 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
1e3a0 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
1e3b0 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74   case 1:.      t
1e3c0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1e3d0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1e3e0 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49  eturn ONE_BYTE_I
1e3f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1e400 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74  se 2:.      test
1e410 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1e420 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1e430 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  rn TWO_BYTE_INT(
1e440 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1e450 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  3:.      testcas
1e460 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e470 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e480 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1e490 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34  Key);.    case 4
1e4a0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e4b0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1e4c0 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   );.      y = FO
1e4d0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1e4e0 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  y);.      return
1e4f0 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
1e500 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e510 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  5: {.      testc
1e520 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e530 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1e540 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  n FOUR_BYTE_UINT
1e550 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
1e560 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
1e570 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1e580 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1e590 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  {.      u64 x = 
1e5a0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1e5b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1e5c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1e5d0 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  80 );.      x = 
1e5e0 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
1e5f0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
1e600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
1e610 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i64)*(i64*)&x;. 
1e620 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1e630 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  rn (serial_type 
1e640 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  - 8);.}../*.** T
1e650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1e660 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
1e670 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
1e680 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
1e690 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
1e6a0 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
1e6b0 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
1e6c0 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
1e6d0 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1e6e0 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
1e6f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1e700 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
1e710 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
1e720 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
1e730 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
1e740 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
1e750 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
1e760 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
1e770 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
1e780 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
1e790 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
1e7a0 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
1e7b0 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
1e7c0 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
1e7d0 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
1e7e0 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73  rgument bSkip is
1e7f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73   non-zero, it is
1e800 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1e810 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1e820 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  eady.** determin
1e830 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1e840 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1e850 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a  keys are equal..
1e860 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
1e870 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
1e880 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
1e890 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
1e8a0 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a  elds. If all .**
1e8b0 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70   fields that app
1e8c0 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73  ear in both keys
1e8d0 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
1e8e0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1e8f0 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  _rc is .** retur
1e900 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  ned..**.** If da
1e910 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1e920 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c  n is discovered,
1e930 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72   set pPKey2->err
1e940 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49  Code to .** SQLI
1e950 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72  TE_CORRUPT and r
1e960 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f  eturn 0. If an O
1e970 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
1e980 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b  untered, .** pPK
1e990 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20  ey2->errCode is 
1e9a0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
1e9b0 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69  MEM and, if it i
1e9c0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a  s not NULL, the.
1e9d0 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  ** malloc-failed
1e9e0 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74   flag set on dat
1e9f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50  abase handle (pP
1ea00 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1ea10 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  db)..*/.int sqli
1ea20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ea30 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20  pareWithSkip(.  
1ea40 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1ea50 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1ea60 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1ea70 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1ea80 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
1ea90 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1eaa0 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
1ead0 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
1eae0 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
1eaf0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1eb10 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1eb20 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
1eb30 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
1eb40 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eb60 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
1eb70 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
1eb80 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1ebb0 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
1ebc0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
1ebd0 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
1ebe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1ebf0 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
1ec00 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
1ec10 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1ec40 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
1ec50 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
1ec60 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
1ec70 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
1ec80 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
1ec90 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1eca0 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1ecb0 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  fo;.  const unsi
1ecc0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1ecd0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1ece0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1ecf0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
1ed00 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74  /* If bSkip is t
1ed10 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  rue, then the ca
1ed20 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1ed30 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1ed40 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
1ed50 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
1ed60 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1ed70 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69  al. Fix the vari
1ed80 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ous stack variab
1ed90 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  les so.  ** that
1eda0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
1edb0 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61  gins comparing a
1edc0 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65  t the second fie
1edd0 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b  ld. */.  if( bSk
1ede0 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31  ip ){.    u32 s1
1edf0 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b  ;.    idx1 = 1 +
1ee00 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1ee10 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20  ey1[1], s1);.   
1ee20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b   szHdr1 = aKey1[
1ee30 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  0];.    d1 = szH
1ee40 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  dr1 + sqlite3Vdb
1ee50 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1ee60 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20  1);.    i = 1;. 
1ee70 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c     pRhs++;.  }el
1ee80 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67  se{.    idx1 = g
1ee90 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1eea0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64  , szHdr1);.    d
1eeb0 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20  1 = szHdr1;.    
1eec0 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64  if( d1>(unsigned
1eed0 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20  )nKey1 ){ .     
1eee0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1eef0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1ef00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ef10 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1ef20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1ef30 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20    }.    i = 0;. 
1ef40 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   }..  VVA_ONLY( 
1ef50 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  mem1.szMalloc = 
1ef60 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
1ef70 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
1ef80 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
1ef90 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1efa0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1efb0 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66  +pPKey2->pKeyInf
1efc0 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
1efd0 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20  y2->nField .    
1efe0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
1eff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f000 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1f010 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1f020 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1f030 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  2->pKeyInfo->nFi
1f040 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
1f050 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
1f060 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1f070 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
1f080 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
1f090 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e   /* RHS is an in
1f0a0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  teger */.    if(
1f0b0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1f0c0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
1f0d0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1f0e0 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1f0f0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1f100 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1f110 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f120 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1f130 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1f140 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1f150 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1f160 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f170 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1f180 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1f190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f1a0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1f1b0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1f1c0 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1f1d0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c         rc = -sql
1f1e0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1f1f0 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d  are(pRhs->u.i, m
1f200 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em1.u.r);.      
1f210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1f220 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63  64 lhs = vdbeRec
1f230 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72  ordDecodeInt(ser
1f240 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31  ial_type, &aKey1
1f250 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [d1]);.        i
1f260 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  64 rhs = pRhs->u
1f270 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  .i;.        if( 
1f280 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
1f290 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f2a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f2b0 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
1f2c0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1f2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f2e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1f2f0 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20  S is real */.   
1f300 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1f310 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
1f320 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1f330 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1f340 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  x1];.      if( s
1f350 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1f360 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72  {.        /* Ser
1f370 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20  ial types 12 or 
1f380 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69  greater are stri
1f390 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67  ngs and blobs (g
1f3a0 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20  reater than.    
1f3b0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e      ** numbers).
1f3c0 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31   Types 10 and 11
1f3d0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22   are currently "
1f3e0 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  reserved for fut
1f3f0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
1f400 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73  use", so it does
1f410 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65  n't really matte
1f420 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c  r what the resul
1f430 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a  ts of comparing.
1f440 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20          ** them 
1f450 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75  to numberic valu
1f460 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20  es are.  */.    
1f470 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1f490 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1f4a0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1f4b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f4c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f4d0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1f4e0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1f4f0 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1f500 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1f510 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1f520 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c     if( mem1.u.r<
1f530 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
1f540 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1f550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1f560 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70  e if( mem1.u.r>p
1f570 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
1f580 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1f590 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f5a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f5b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f5c0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1f5d0 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73  e(mem1.u.i, pRhs
1f5e0 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20  ->u.r);.        
1f5f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f600 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1f610 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65   string */.    e
1f620 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1f630 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
1f640 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
1f650 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
1f660 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1f670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1f680 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1f690 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1f6a0 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
1f6b0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f6c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
1f6d0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1f6e0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
1f6f0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1f700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
1f710 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m1.n = (serial_t
1f720 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
1f730 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f740 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75   (d1+mem1.n)==(u
1f750 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1f760 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f770 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29  e( (d1+mem1.n+1)
1f780 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1f790 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1f7a0 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28   (d1+mem1.n) > (
1f7b0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1f7d0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1f7e0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1f7f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1f800 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1f810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1f820 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1f830 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65     }else if( pKe
1f840 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
1f850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1f860 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1f870 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  ->enc;.         
1f880 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1f890 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  nfo->db;.       
1f8a0 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20     mem1.flags = 
1f8b0 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20  MEM_Str;.       
1f8c0 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61     mem1.z = (cha
1f8d0 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20  r*)&aKey1[d1];. 
1f8e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
1f8f0 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1f900 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng(.            
1f910 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70    &mem1, pRhs, p
1f920 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1f930 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43  ], &pPKey2->errC
1f940 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ode.          );
1f950 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f960 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
1f970 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c  mp = MIN(mem1.n,
1f980 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
1f990 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
1f9a0 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
1f9b0 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
1f9c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
1f9d0 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d   ) rc = mem1.n -
1f9e0 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20   pRhs->n; .     
1f9f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1fa00 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1fa10 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20  s a blob */.    
1fa20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1fa30 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1fa40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1fa50 20 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20   (pRhs->flags & 
1fa60 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
1fa70 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  pRhs->n==0 );.  
1fa80 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1fa90 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1faa0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1fab0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1fac0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1fad0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1fae0 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1faf0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1fb00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1fb10 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1fb20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1fb30 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1fb40 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1fb50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1fb60 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1fb70 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1fb80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1fb90 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1fba0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1fbb0 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1fbc0 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1fbd0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1fbe0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1fbf0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1fc00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fc10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1fc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc30 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1fc40 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
1fc50 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1fc60 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1fc70 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41          if( !isA
1fc80 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68  llZero((const ch
1fc90 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e  ar*)&aKey1[d1],n
1fca0 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Str) ){.        
1fcb0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1fcc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fcd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53           rc = nS
1fce0 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65  tr - pRhs->u.nZe
1fcf0 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ro;.          }.
1fd00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fd10 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1fd20 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52  p = MIN(nStr, pR
1fd30 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1fd40 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1fd50 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1fd60 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1fd70 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1fd80 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
1fd90 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ->n;.        }. 
1fda0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fdb0 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c    /* RHS is null
1fdc0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   */.    else{.  
1fdd0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1fde0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1fdf0 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61       rc = (seria
1fe00 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20  l_type!=0);.    
1fe10 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  }..    if( rc!=0
1fe20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   ){.      if( pK
1fe30 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1fe40 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1fe50 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
1fe60 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1fe70 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1fe80 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1fe90 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63  Key1, pPKey2, rc
1fea0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1feb0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1fec0 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1fed0 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1fee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fef0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
1ff00 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
1ff10 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1ff20 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1ff30 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ff40 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
1ff50 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
1ff60 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
1ff70 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
1ff80 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  d)szHdr1 && i<pP
1ff90 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Key2->nField && 
1ffa0 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
1ffb0 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1ffc0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1ffd0 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1ffe0 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1fff0 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
20000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
20010 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
20020 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
20030 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
20040 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
20050 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
20060 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
20070 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
20080 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
20090 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
200a0 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
200b0 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
200c0 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
200d0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
200e0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
200f0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
20100 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
20110 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
20120 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
20130 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
20140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  */.  assert( COR
20150 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20  RUPT_DB .       
20160 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  || vdbeRecordCom
20170 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
20180 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20190 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
201a0 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc) .       || p
201b0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
201c0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
201d0 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
201e0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 1;.  return pP
201f0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
20200 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
20210 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20220 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
20230 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
20240 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
20250 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
20260 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
20270 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
20280 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
20290 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
202a0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
202b0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
202c0 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
202d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
202e0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
202f0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
20300 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20310 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
20320 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
20330 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
20340 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
20350 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
20360 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
20370 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
20380 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
20390 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
203a0 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
203b0 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
203c0 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
203d0 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
203e0 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
203f0 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
20400 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
20410 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
20420 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
20430 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
20440 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
20450 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
20460 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
20470 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
20480 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
20490 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
204a0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
204b0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
204c0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
204d0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
204e0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
204f0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
20500 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
20510 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
20520 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
20530 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
20540 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
20550 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
20560 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a  u64 x;.  i64 v;.
20570 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64    i64 lhs;..  vd
20580 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
20590 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
205a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
205b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
205c0 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a    assert( (*(u8*
205d0 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c  )pKey1)<=0x3F ||
205e0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
205f0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
20600 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
20610 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
20620 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20630 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e  /.      lhs = ON
20640 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
20650 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20660 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
20670 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20680 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
20690 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
206a0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
206b0 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  s = TWO_BYTE_INT
206c0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
206d0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
206e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
206f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
20700 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
20710 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
20720 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f      lhs = THREE_
20730 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
20740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20750 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
20760 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20770 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
20780 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
20790 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
207a0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
207b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  Key);.      lhs 
207c0 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  = (i64)*(int*)&y
207d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
207e0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
207f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20800 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
20810 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
20820 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
20830 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  s = FOUR_BYTE_UI
20840 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
20850 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
20860 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
20870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20880 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
20890 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
208a0 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62  case 6: { /* 8-b
208b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
208c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20  er */.      x = 
208d0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
208e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  Key);.      x = 
208f0 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
20900 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
20910 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28  ;.      lhs = *(
20920 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74  i64*)&x;.      t
20930 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20940 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20950 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
20960 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b   .      lhs = 0;
20970 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20980 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20    case 9:.      
20990 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  lhs = 1;.      b
209a0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  reak;..    /* Th
209b0 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65  is case could be
209c0 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74   removed without
209d0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65   changing the re
209e0 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67  sults of running
209f0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  .    ** this cod
20a00 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20  e. Including it 
20a10 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65  causes gcc to ge
20a20 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20  nerate a faster 
20a30 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73  switch .    ** s
20a40 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20  tatement (since 
20a50 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69  the range of swi
20a60 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20  tch targets now 
20a70 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61  starts at zero a
20a80 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e  nd.    ** is con
20a90 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65  tiguous) but doe
20aa0 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
20ab0 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74  duplicate code t
20ac0 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20  o be generated. 
20ad0 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73     ** (as gcc is
20ae0 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74   clever enough t
20af0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77  o combine the tw
20b00 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f  o like cases). O
20b10 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d  ther .    ** com
20b20 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20  pilers might be 
20b30 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20  similar.  */ .  
20b40 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37    case 0: case 7
20b50 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
20b60 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20b70 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
20b80 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a  Key1, pPKey2);..
20b90 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
20ba0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
20bb0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20bc0 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
20bd0 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20   pPKey2);.  }.. 
20be0 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65   v = pPKey2->aMe
20bf0 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20  m[0].u.i;.  if( 
20c00 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v>lhs ){.    res
20c10 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
20c20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73   }else if( v<lhs
20c30 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
20c40 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73  Key2->r2;.  }els
20c50 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46  e if( pPKey2->nF
20c60 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ield>1 ){.    /*
20c70 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
20c80 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
20c90 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d  s are equal. Com
20ca0 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e  pare the trailin
20cb0 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  g .    ** fields
20cc0 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  .  */.    res = 
20cd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20ce0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
20cf0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20d00 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  PKey2, 1);.  }el
20d10 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  se{.    /* The f
20d20 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
20d30 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
20d40 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20  equal and there 
20d50 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a  are no trailing.
20d60 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52      ** fields. R
20d70 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
20d80 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73  fault_rc in this
20d90 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65   case. */.    re
20da0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
20db0 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65  ult_rc;.    pPKe
20dc0 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
20dd0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
20de0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20df0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
20e00 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
20e10 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
20e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20e30 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
20e40 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
20e50 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
20e60 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
20e70 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
20e80 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
20e90 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e  PKey2 is a strin
20ea0 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20  g, that (b) the 
20eb0 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75  first field.** u
20ec0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ses the collatio
20ed0 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
20ee0 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74  Y and (c) that t
20ef0 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
20f00 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20  r varint .** at 
20f10 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
20f20 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
20f30 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
20f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20f50 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20f60 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
20f70 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
20f80 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
20f90 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
20fa0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
20fb0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
20fc0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
20fd0 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28  st u8 *aKey1 = (
20fe0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b  const u8*)pKey1;
20ff0 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
21000 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  pe;.  int res;..
21010 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
21020 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20  ->aMem[0].flags 
21030 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76  & MEM_Str );.  v
21040 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
21050 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
21060 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
21070 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  Key2->pKeyInfo);
21080 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  .  getVarint32(&
21090 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c  aKey1[1], serial
210a0 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65  _type);.  if( se
210b0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
210c0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
210d0 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r1;      /* (p
210e0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
210f0 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c   number or a nul
21100 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  l */.  }else if(
21110 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
21120 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72   0x01) ){ .    r
21130 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
21140 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
21150 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62  nKey1) is a blob
21160 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
21170 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69   int nCmp;.    i
21180 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74  nt nStr;.    int
21190 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30   szHdr = aKey1[0
211a0 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28  ];..    nStr = (
211b0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20  serial_type-12) 
211c0 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a  / 2;.    if( (sz
211d0 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b  Hdr + nStr) > nK
211e0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b  ey1 ){.      pPK
211f0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
21200 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
21210 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
21220 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f  turn 0;    /* Co
21230 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
21240 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e  }.    nCmp = MIN
21250 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
21260 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20  ].n, nStr );.   
21270 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61   res = memcmp(&a
21280 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b  Key1[szHdr], pPK
21290 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20  ey2->aMem[0].z, 
212a0 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  nCmp);..    if( 
212b0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
212c0 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b  res = nStr - pPK
212d0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a  ey2->aMem[0].n;.
212e0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
212f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21300 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
21310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
21320 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
21330 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
21340 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
21350 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
21360 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21370 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
21380 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
21390 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  ;.          pPKe
213a0 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
213b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
213c0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
213d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
213e0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
213f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21400 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21410 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
21420 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
21430 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
21440 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
21450 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
21460 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
21470 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
21480 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
21490 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
214a0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
214b0 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43  res).       || C
214c0 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
214d0 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
214e0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
214f0 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
21500 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
21510 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
21520 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
21530 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
21540 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20  re() compatible 
21550 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74  function.** suit
21560 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69  able for compari
21570 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65  ng serialized re
21580 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70  cords to the unp
21590 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73  acked record pas
215a0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
215b0 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
215c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71  RecordCompare sq
215d0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
215e0 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63  pare(UnpackedRec
215f0 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61  ord *p){.  /* va
21600 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
21610 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e  eInt() and varin
21620 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  tRecordCompareSt
21630 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75  ring() both assu
21640 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  me.  ** that the
21650 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
21660 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
21670 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
21680 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20  of each record. 
21690 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69   ** fits in a si
216a0 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20  ngle byte (i.e. 
216b0 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e  is 127 or less).
216c0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
216d0 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61  pareInt().  ** a
216e0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
216f0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
21700 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72  verread a buffer
21710 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65   by at least the
21720 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70   .  ** maximum p
21730 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65  ossible legal he
21740 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38  ader size plus 8
21750 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20   bytes. Because 
21760 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75  there is.  ** gu
21770 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
21780 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20  t least 74 (but 
21790 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f  not 136) bytes o
217a0 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77  f padding follow
217b0 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75  ing each.  ** bu
217c0 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76  ffer passed to v
217d0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
217e0 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b  reInt() this mak
217f0 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74  es it convenient
21800 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74   to.  ** limit t
21810 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
21820 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65  eader to 64 byte
21830 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  s in cases where
21840 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
21850 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
21860 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger..  **.  ** T
21870 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
21880 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c  o enforce this l
21890 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69  imit is to consi
218a0 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73  der only records
218b0 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69   with.  ** 13 fi
218c0 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66  elds or less. If
218d0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
218e0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
218f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  the maximum lega
21900 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69  l.  ** header si
21910 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20  ze is (12*5 + 1 
21920 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a  + 1) bytes.  */.
21930 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e    if( (p->pKeyIn
21940 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e  fo->nField + p->
21950 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
21960 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e  d)<=13 ){.    in
21970 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65  t flags = p->aMe
21980 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20  m[0].flags;.    
21990 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
219a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29  >aSortOrder[0] )
219b0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
219c0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
219d0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
219e0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
219f0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
21a00 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
21a10 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
21a20 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
21a30 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
21a40 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
21a50 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
21a60 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
21a70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
21a80 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
21a90 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
21aa0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
21ab0 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
21ac0 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
21ad0 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f  MEM_Null|MEM_Blo
21ae0 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65  b))==0 && p->pKe
21af0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d  yInfo->aColl[0]=
21b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
21b10 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  rt( flags & MEM_
21b20 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Str );.      ret
21b30 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
21b40 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20  mpareString;.   
21b50 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
21b60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21b70 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a  rdCompare;.}../*
21b80 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
21b90 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
21ba0 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
21bb0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
21bc0 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
21bd0 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
21be0 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
21bf0 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
21c00 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
21c10 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
21c20 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
21c30 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
21c40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
21c50 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
21c60 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
21c70 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
21c80 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
21c90 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
21ca0 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
21cb0 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
21cc0 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
21cd0 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
21ce0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
21cf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
21d00 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
21d10 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
21d20 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
21d30 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
21d40 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
21d50 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
21d60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21d70 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
21d80 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
21d90 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
21da0 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
21db0 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
21dc0 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
21dd0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
21de0 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a   Mem m, v;..  /*
21df0 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
21e00 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
21e10 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
21e20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
21e30 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
21e40 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
21e50 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
21e60 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
21e70 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
21e80 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
21e90 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
21ea0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
21eb0 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
21ec0 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
21ed0 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
21ee0 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
21ef0 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
21f00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
21f10 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21f20 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
21f30 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71  .  nCellKey = sq
21f40 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
21f50 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61  dSize(pCur);.  a
21f60 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
21f70 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
21f80 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
21f90 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
21fa0 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
21fb0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
21fc0 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
21fd0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
21fe0 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
21ff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
22000 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
22010 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  ur, 0, (u32)nCel
22020 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28  lKey, &m);.  if(
22030 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
22040 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
22050 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
22060 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
22070 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
22080 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
22090 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
220a0 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
220b0 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
220c0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
220d0 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
220e0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
220f0 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
22100 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
22110 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
22120 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
22130 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
22140 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
22150 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
22160 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
22170 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
22180 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
22190 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
221a0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
221b0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
221c0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
221d0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
221e0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
221f0 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
22200 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
22210 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22220 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
22230 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22240 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
22250 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22260 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
22270 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
22280 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22290 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
222a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
222b0 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
222c0 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
222d0 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
222e0 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
222f0 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
22300 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
22310 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
22320 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53  Rowid = sqlite3S
22330 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79  mallTypeSizes[ty
22340 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74  peRowid];.  test
22350 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
22360 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
22370 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
22380 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
22390 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
223a0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
223b0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
223c0 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
223d0 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
223e0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
223f0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
22400 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
22410 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
22420 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
22430 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
22440 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
22450 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
22460 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
22470 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
22480 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
22490 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
224a0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
224b0 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
224c0 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
224d0 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
224e0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
224f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
22500 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
22510 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
22520 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21  ase( m.szMalloc!
22530 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
22540 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
22550 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22560 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
22580 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
22590 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
225a0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
225b0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
225c0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
225d0 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
225e0 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
225f0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
22600 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
22610 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
22620 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
22630 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
22640 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
22650 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
22660 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
22670 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
22680 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
22690 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
226a0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
226b0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
226c0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
226d0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
226e0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
226f0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
22700 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
22710 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
22720 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
22730 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
22740 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
22750 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
22760 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
22770 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
22780 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
22790 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
227a0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
227b0 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69  yCompare(.  sqli
227c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227e0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
227f0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ion */.  VdbeCur
22800 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
22810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22820 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
22830 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
22840 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
22850 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20  pUnpacked,      
22860 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
22870 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
22880 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
228b0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
228c0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
228d0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
228e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
228f0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65  rsor *pCur;.  Me
22900 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
22910 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
22920 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
22930 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70   pCur = pC->uc.p
22940 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
22950 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
22960 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
22970 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
22980 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
22990 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
229a0 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
229b0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
229c0 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
229d0 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
229e0 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
229f0 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
22a00 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
22a10 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
22a20 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
22a30 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
22a40 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
22a50 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
22a60 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
22a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22a80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22a90 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
22aa0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
22ab0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22ac0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
22ad0 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
22ae0 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20  nCellKey, &m);. 
22af0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
22b00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
22b10 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
22b20 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
22b30 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
22b40 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
22b50 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
22b60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22b70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
22b90 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
22ba0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
22bb0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
22bc0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
22bd0 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
22be0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
22bf0 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
22c00 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
22c10 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
22c20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
22c30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22c40 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
22c50 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
22c60 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
22c70 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
22c80 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
22c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
22ca0 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
22cb0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
22cc0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
22cd0 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
22ce0 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
22cf0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
22d00 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
22d10 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
22d20 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
22d30 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
22d40 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
22d50 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
22d60 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
22d70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
22d80 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
22d90 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
22da0 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
22db0 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
22dc0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
22dd0 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
22de0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
22df0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
22e00 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
22e10 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
22e20 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
22e30 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
22e40 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
22e50 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
22e60 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
22e70 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
22e80 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
22e90 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
22ea0 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
22eb0 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
22ec0 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
22ed0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22ee0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
22ef0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
22f00 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
22f10 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
22f20 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
22f30 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
22f40 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
22f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
22f70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22f80 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
22f90 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
22fa0 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
22fb0 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
22fc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22fd0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
22fe0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
22ff0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
23000 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
23010 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
23020 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
23030 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
23040 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
23050 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
23060 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
23070 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
23080 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
23090 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
230a0 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
230b0 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
230c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
230d0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
230e0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
230f0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
23100 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
23110 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
23120 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
23130 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
23140 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
23150 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
23160 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
23170 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
23180 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
23190 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
231a0 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
231b0 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
231c0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
231d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
231e0 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
231f0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
23200 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
23210 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
23220 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
23230 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
23240 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
23250 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
23260 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
23270 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
23280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23290 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20  return pRet;.   
232a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
232b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  0;.}../*.** Conf
232c0 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62  igure SQL variab
232d0 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20  le iVar so that 
232e0 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61  binding a new va
232f0 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c  lue to it signal
23300 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f  s.** to sqlite3_
23310 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61  reoptimize() tha
23320 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74  t re-preparing t
23330 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79  he statement may
23340 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20   result.** in a 
23350 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61  better query pla
23360 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
23370 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
23380 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
23390 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ar){.  assert( i
233a0 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  Var>0 );.  if( i
233b0 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76  Var>=32 ){.    v
233c0 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38  ->expmask |= 0x8
233d0 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65  0000000;.  }else
233e0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
233f0 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
23400 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
23410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23420 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
23430 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
23440 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
23450 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
23460 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
23470 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
23480 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
23490 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
234a0 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
234b0 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
234c0 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
234d0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
234e0 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
234f0 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
23500 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
23510 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
23520 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
23530 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
23540 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
23550 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23560 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
23570 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
23580 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
23590 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
235a0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
235b0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
235c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
235d0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
235e0 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
235f0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
23600 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23610 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
23620 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
23630 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
23640 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
23650 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
23660 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
23670 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
23680 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
23690 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
236a0 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
236b0 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
236c0 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
236d0 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
236e0 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
236f0 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
23700 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
23710 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
23720 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23730 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
23740 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
23750 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
23760 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
23770 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
23780 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
23790 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
237a0 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
237b0 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
237c0 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55  b, int nField, U
237d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
237e0 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
237f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23800 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
23810 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20  i++){.      Mem 
23820 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
23830 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
23840 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73  Mem->zMalloc ) s
23850 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
23860 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
23870 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
23880 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
23890 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
238a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
238b0 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
238c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
238d0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
238e0 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
238f0 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
23900 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
23910 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
23920 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
23930 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
23940 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
23950 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23960 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
23970 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
23980 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
23990 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
239a0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
239b0 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
239c0 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
239d0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
239e0 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
239f0 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
23a00 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
23a10 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
23a20 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
23a30 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
23a60 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
23a70 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
23a80 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
23a90 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
23aa0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
23ab0 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
23ac0 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
23ad0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23af0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
23b00 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
23b10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23b20 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
23b30 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
23b40 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
23b50 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
23b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
23b70 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
23b80 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
23bb0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
23bc0 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
23bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23be0 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
23bf0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
23c00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
23c10 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
23c20 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
23c30 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
23c40 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
23c50 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
23c60 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
23c70 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
23c80 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
23c90 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
23ca0 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
23cb0 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
23cc0 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
23cd0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
23ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
23cf0 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
23d00 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
23d10 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
23d20 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
23d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23d40 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
23d50 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
23d60 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
23d70 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
23d80 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
23d90 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
23da0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
23db0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
23dc0 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
23dd0 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
23de0 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
23df0 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
23e00 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
23e10 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
23e20 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
23e30 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
23e40 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
23e50 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
23e60 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
23e70 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23e80 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
23e90 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
23ea0 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
23eb0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23ec0 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54  info.nField = pT
23ed0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75  ab->nCol;.  preu
23ee0 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53  pdate.keyinfo.aS
23ef0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
23f00 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a  &fakeSortOrder;.
23f10 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
23f20 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65  1 = iKey1;.  pre
23f30 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69  update.iKey2 = i
23f40 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74  Key2;.  preupdat
23f50 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a  e.pTab = pTab;..
23f60 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
23f70 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20   = &preupdate;. 
23f80 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
23f90 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65  allback(db->pPre
23fa0 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f  UpdateArg, db, o
23fb0 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b  p, zDb, zTbl, iK
23fc0 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64  ey1, iKey2);.  d
23fd0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
23fe0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
23ff0 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
24000 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64 62  .aRecord);.  vdb
24010 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62  eFreeUnpacked(db
24020 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69  , preupdate.keyi
24030 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31 2c 20 70 72  nfo.nField+1, pr
24040 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
24050 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
24060 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
24070 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69  date.keyinfo.nFi
24080 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
24090 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a  .pNewUnpacked);.
240a0 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e    if( preupdate.
240b0 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  aNew ){.    int 
240c0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
240d0 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20  i<pCsr->nField; 
240e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
240f0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
24100 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65  e(&preupdate.aNe
24110 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w[i]);.    }.   
24120 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
24130 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61  (db, preupdate.a
24140 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  New);.  }.}.#end
24150 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
24160 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
24170 4f 4b 20 2a 2f 0a                                OK */.