/ Hex Artifact Content
Login

Artifact 031422c66e272c7f1027070e7f0858f4c418dfbc:


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 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
08e0: 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70 20 61  e the Vdbe.aOp a
08f0: 72 72 61 79 20 73 6f 20 74 68 61 74 20 69 74 20  rray so that it 
0900: 69 73 20 61 74 20 6c 65 61 73 74 20 6e 4f 70 20  is at least nOp 
0910: 65 6c 65 6d 65 6e 74 73 20 6c 61 72 67 65 72 20  elements larger 
0920: 0a 2a 2a 20 74 68 61 6e 20 69 74 73 20 63 75 72  .** than its cur
0930: 72 65 6e 74 20 73 69 7a 65 2e 20 6e 4f 70 20 69  rent size. nOp i
0940: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
0950: 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
0960: 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 31 30 32 34  equal.** to 1024
0970: 2f 73 69 7a 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a  /sizeof(Op)..**.
0980: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
0990: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
09a0: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
09b0: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
09c0: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
09d0: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
09e0: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
09f0: 50 61 72 73 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72  Parse.nOpAlloc r
0a00: 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  emain .** unchan
0a10: 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20  ged (this is so 
0a20: 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73  that any opcodes
0a30: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
0a40: 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f  ed can be .** co
0a50: 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61  rrectly dealloca
0a60: 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
0a70: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56  he rest of the V
0a80: 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dbe)..*/.static 
0a90: 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28  int growOpArray(
0aa0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e 4f 70  Vdbe *v, int nOp
0ab0: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65  ){.  VdbeOp *pNe
0ac0: 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  w;.  Parse *p = 
0ad0: 76 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  v->pParse;..  /*
0ae0: 20 54 68 65 20 53 51 4c 49 54 45 5f 54 45 53 54   The SQLITE_TEST
0af0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0b00: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
0b10: 69 6f 6e 20 69 73 20 64 65 73 69 67 6e 65 64 20  ion is designed 
0b20: 74 6f 20 66 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f  to force.  ** mo
0b30: 72 65 20 66 72 65 71 75 65 6e 74 20 72 65 61 6c  re frequent real
0b40: 6c 6f 63 73 20 61 6e 64 20 68 65 6e 63 65 20 70  locs and hence p
0b50: 72 6f 76 69 64 65 20 6d 6f 72 65 20 6f 70 70 6f  rovide more oppo
0b60: 72 74 75 6e 69 74 69 65 73 20 66 6f 72 20 0a 20  rtunities for . 
0b70: 20 2a 2a 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f   ** simulated OO
0b80: 4d 20 66 61 75 6c 74 73 2e 20 20 53 51 4c 49 54  M faults.  SQLIT
0b90: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0ba0: 54 52 45 53 53 20 69 73 20 67 65 6e 65 72 61 6c  TRESS is general
0bb0: 6c 79 20 75 73 65 64 0a 20 20 2a 2a 20 64 75 72  ly used.  ** dur
0bc0: 69 6e 67 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  ing testing only
0bd0: 2e 20 20 57 69 74 68 20 53 51 4c 49 54 45 5f 54  .  With SQLITE_T
0be0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
0bf0: 53 53 20 67 72 6f 77 20 74 68 65 20 6f 70 20 61  SS grow the op a
0c00: 72 72 61 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  rray.  ** by the
0c10: 20 6d 69 6e 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74   minimum* amount
0c20: 20 72 65 71 75 69 72 65 64 20 75 6e 74 69 6c 20   required until 
0c30: 74 68 65 20 73 69 7a 65 20 72 65 61 63 68 65 73  the size reaches
0c40: 20 35 31 32 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20   512.  Normal.  
0c50: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 28 77 69  ** operation (wi
0c60: 74 68 6f 75 74 20 53 51 4c 49 54 45 5f 54 45 53  thout SQLITE_TES
0c70: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0c80: 29 20 69 73 20 74 6f 20 64 6f 75 62 6c 65 20 74  ) is to double t
0c90: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
0ca0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 20 61  size of the op a
0cb0: 72 72 61 79 20 6f 72 20 61 64 64 20 31 4b 42 20  rray or add 1KB 
0cc0: 6f 66 20 73 70 61 63 65 2c 20 77 68 69 63 68 65  of space, whiche
0cd0: 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 20  ver is smaller. 
0ce0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0cf0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
0d00: 52 45 53 53 0a 20 20 69 6e 74 20 6e 4e 65 77 20  RESS.  int nNew 
0d10: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d  = (p->nOpAlloc>=
0d20: 35 31 32 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  512 ? p->nOpAllo
0d30: 63 2a 32 20 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  c*2 : p->nOpAllo
0d40: 63 2b 6e 4f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  c+nOp);.#else.  
0d50: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e  int nNew = (p->n
0d60: 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70  OpAlloc ? p->nOp
0d70: 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28  Alloc*2 : (int)(
0d80: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
0d90: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
0da0: 4d 45 54 45 52 28 6e 4f 70 29 3b 0a 23 65 6e 64  METER(nOp);.#end
0db0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  if..  assert( nO
0dc0: 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f 66 28  p<=(1024/sizeof(
0dd0: 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Op)) );.  assert
0de0: 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41  ( nNew>=(p->nOpA
0df0: 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20 20 70  lloc+nOp) );.  p
0e00: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0e10: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d  ealloc(p->db, v-
0e20: 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  >aOp, nNew*sizeo
0e30: 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20 70 4e  f(Op));.  if( pN
0e40: 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73 7a 4f  ew ){.    p->szO
0e50: 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  pAlloc = sqlite3
0e60: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
0e70: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 70  db, pNew);.    p
0e80: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ->nOpAlloc = p->
0e90: 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65 6f 66  szOpAlloc/sizeof
0ea0: 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61 4f 70  (Op);.    v->aOp
0eb0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
0ec0: 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53 51  eturn (pNew ? SQ
0ed0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
0ee0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 7d 0a  _NOMEM_BKPT);.}.
0ef0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f00: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75  EBUG./* This rou
0f10: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63  tine is just a c
0f20: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
0f30: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
0f40: 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a  int that will.**
0f50: 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 68   fire after each
0f60: 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72   opcode is inser
0f70: 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65  ted and displaye
0f80: 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47  d using.** "PRAG
0f90: 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61  MA vdbe_addoptra
0fa0: 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69  ce=on"..*/.stati
0fb0: 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f  c void test_addo
0fc0: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  p_breakpoint(voi
0fd0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
0fe0: 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d   n = 0;.  n++;.}
0ff0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1000: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
1010: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
1020: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
1030: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
1040: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
1050: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
1060: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
1070: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
1080: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
1090: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
10a0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
10b0: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
10d0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
10e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
10f0: 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33  **    p1, p2, p3
1100: 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a        Operands.*
1110: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
1120: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1130: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
1140: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
1150: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
1160: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1170: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
1180: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1190: 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65  of the P4.** ope
11a0: 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rand..*/.static 
11b0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
11c0: 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64 62 65  int growOp3(Vdbe
11d0: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
11e0: 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74   p1, int p2, int
11f0: 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74 28 20   p3){.  assert( 
1200: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1210: 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20  loc<=p->nOp );. 
1220: 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79   if( growOpArray
1230: 28 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20  (p, 1) ) return 
1240: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  1;.  assert( p->
1250: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
1260: 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74  >p->nOp );.  ret
1270: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1280: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1290: 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e 74 20   p2, p3);.}.int 
12a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12b0: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
12c0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
12d0: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e  2, int p3){.  in
12e0: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
12f0: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
1300: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
1310: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1320: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1330: 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f 70 3c  rt( op>=0 && op<
1340: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
1350: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1360: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75  c<=i ){.    retu
1370: 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70  rn growOp3(p, op
1380: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1390: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20   }.  p->nOp++;. 
13a0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
13b0: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ];.  pOp->opcode
13c0: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70   = (u8)op;.  pOp
13d0: 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  ->p5 = 0;.  pOp-
13e0: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
13f0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
1400: 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d  >p3 = p3;.  pOp-
1410: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.p = 0;.  pOp
1420: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
1430: 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51  TUSED;.#ifdef SQ
1440: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
1450: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70  AIN_COMMENTS.  p
1460: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  Op->zComment = 0
1470: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1480: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1490: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
14a0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
14b0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69  opTrace ){.    i
14c0: 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50  nt jj, kk;.    P
14d0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
14e0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66 6f  ->pParse;.    fo
14f0: 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 70 50  r(jj=kk=0; jj<pP
1500: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1510: 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74   jj++){.      st
1520: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1530: 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  x = pParse->aCol
1540: 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 20  Cache + jj;.    
1550: 20 20 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d    printf(" r[%d]
1560: 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52  ={%d:%d}", x->iR
1570: 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78  eg, x->iTable, x
1580: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1590: 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20    kk++;.    }.  
15a0: 20 20 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74    if( kk ) print
15b0: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  f("\n");.    sql
15c0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
15d0: 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  0, i, &p->aOp[i]
15e0: 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f  );.    test_addo
15f0: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  p_breakpoint();.
1600: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1610: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
1620: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
1630: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
1640: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1650: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
1660: 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63  RAGE.  pOp->iSrc
1670: 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Line = 0;.#endif
1680: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
1690: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
16a0: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
16b0: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
16c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16d0: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
16e0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
16f0: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
1700: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1710: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
1720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1730: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
1740: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1750: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
1760: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1770: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
1780: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1790: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
17a0: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  , p2, 0);.}../* 
17b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
17c0: 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  r an uncondition
17d0: 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  al jump to instr
17e0: 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a  uction iDest.*/.
17f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 47  int sqlite3VdbeG
1800: 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oto(Vdbe *p, int
1810: 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75 72   iDest){.  retur
1820: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1830: 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op3(p, OP_Goto, 
1840: 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d 0a  0, iDest, 0);.}.
1850: 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1860: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 73  e to cause the s
1870: 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62 65  tring zStr to be
1880: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a 20   loaded into.** 
1890: 72 65 67 69 73 74 65 72 20 69 44 65 73 74 0a 2a  register iDest.*
18a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18b0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62 65  eLoadString(Vdbe
18c0: 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20   *p, int iDest, 
18d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
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 34 28 70 2c  te3VdbeAddOp4(p,
1900: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
1910: 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c 20  iDest, 0, zStr, 
1920: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  0);.}../*.** Gen
1930: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1940: 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c 74  initializes mult
1950: 69 70 6c 65 20 72 65 67 69 73 74 65 72 73 20 74  iple registers t
1960: 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74 65  o string or inte
1970: 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ger.** constants
1980: 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 73  .  The registers
1990: 20 62 65 67 69 6e 20 77 69 74 68 20 69 44 65 73   begin with iDes
19a0: 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 63  t and increase c
19b0: 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a 2a  onsecutively..**
19c0: 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69 73   One register is
19d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72   initialized for
19e0: 20 65 61 63 68 20 63 68 61 72 61 63 67 74 65 72   each characgter
19f0: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20 46   in zTypes[].  F
1a00: 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20 63  or each.** "s" c
1a10: 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79 70  haracter in zTyp
1a20: 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74  es[], the regist
1a30: 65 72 20 69 73 20 61 20 73 74 72 69 6e 67 20 69  er is a string i
1a40: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
1a50: 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f  s.** not NULL, o
1a60: 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68 65  r OP_Null if the
1a70: 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c 6c   value is a null
1a80: 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20 65   pointer.  For e
1a90: 61 63 68 20 22 69 22 20 63 68 61 72 61 63 74 65  ach "i" characte
1aa0: 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b 5d  r.** in zTypes[]
1ab0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1ac0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1ad0: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
1ae0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1af0: 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a  MultiLoad(Vdbe *
1b00: 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f  p, int iDest, co
1b10: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73  nst char *zTypes
1b20: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1b30: 74 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t ap;.  int i;. 
1b40: 20 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74   char c;.  va_st
1b50: 61 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b  art(ap, zTypes);
1b60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
1b70: 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20   zTypes[i])!=0; 
1b80: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  i++){.    if( c=
1b90: 3d 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f  ='s' ){.      co
1ba0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61  nst char *z = va
1bb0: 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1bc0: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  har*);.      sql
1bd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1be0: 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c  , z==0 ? OP_Null
1bf0: 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30   : OP_String8, 0
1c00: 2c 20 69 44 65 73 74 2b 2b 2c 20 30 2c 20 7a 2c  , iDest++, 0, z,
1c10: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1c20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
1c30: 3d 27 69 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='i' );.      sq
1c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c50: 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76  p, OP_Integer, v
1c60: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20  a_arg(ap, int), 
1c70: 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 20 7d 0a  iDest++);.    }.
1c80: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
1c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1ca0: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1cb0: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1cc0: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1cd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ce0: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1cf0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1d00: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1d10: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
1d20: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1d40: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
1d50: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
1d60: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
1d70: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d90: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1da0: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dc0: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1dd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1de0: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1df0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1e00: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1e10: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
1e20: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
1e30: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1e40: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1e50: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1e60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1e70: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1e80: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1e90: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1ea0: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1eb0: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1ec0: 70 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  p4 value with a 
1ed0: 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50  P4_INT64 or.** P
1ee0: 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a  4_REAL type..*/.
1ef0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1f00: 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62  ddOp4Dup8(.  Vdb
1f10: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1f20: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1f30: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1f40: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
1f50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1f60: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
1f70: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
1f80: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
1f90: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb0: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1fc0: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1fd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1fe0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1ff0: 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20  onst u8 *zP4,   
2000: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
2010: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
2020: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
2030: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
2040: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
2050: 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  4copy = sqlite3D
2060: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c  bMallocRawNN(sql
2070: 69 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38  ite3VdbeDb(p), 8
2080: 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20  );.  if( p4copy 
2090: 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c  ) memcpy(p4copy,
20a0: 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75   zP4, 8);.  retu
20b0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
20c0: 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp4(p, op, p1, 
20d0: 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20  p2, p3, p4copy, 
20e0: 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p4type);.}../*.*
20f0: 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73  * Add an OP_Pars
2100: 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20  eSchema opcode. 
2110: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2120: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
2130: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
2140: 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74  ddOp4() since it
2150: 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e   needs to also n
2160: 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c  eeds to mark all
2170: 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61   btrees.** as ha
2180: 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a  ving been used..
2190: 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65  **.** The zWhere
21a0: 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76   string must hav
21b0: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
21c0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
21d0: 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72  loc()..** This r
21e0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65  outine will take
21f0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
2200: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  e allocated memo
2210: 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ry..*/.void sqli
2220: 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
2230: 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c  chemaOp(Vdbe *p,
2240: 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a   int iDb, char *
2250: 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a  zWhere){.  int j
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2270: 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp4(p, OP_Pars
2280: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
2290: 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44   0, zWhere, P4_D
22a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
22b0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
22c0: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
22d0: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
22e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
22f0: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2300: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
2310: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
2320: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2330: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2340: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
2350: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2360: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
2370: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2390: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
23a0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
23b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
23c0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
23d0: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
23e0: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
23f0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
2400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2410: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
2420: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
2430: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2440: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
2450: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
2460: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2470: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
2480: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
2490: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
24a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
24b0: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
24c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
24d0: 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  ];.    pOp->p4ty
24e0: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
24f0: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70     pOp->p4.i = p
2500: 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  4;.  }.  return 
2510: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65  addr;.}../* Inse
2520: 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  rt the end of a 
2530: 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f  co-routine.*/.vo
2540: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
2550: 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20  dCoroutine(Vdbe 
2560: 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64  *v, int regYield
2570: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
2580: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
2590: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
25a0: 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61  eld);..  /* Clea
25b0: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
25c0: 72 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20  register cache, 
25d0: 74 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67  thereby ensuring
25e0: 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20   that each.  ** 
25f0: 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69  co-routine has i
2600: 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65  ts own independe
2610: 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74  nt set of regist
2620: 65 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d  ers, because co-
2630: 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69  routines.  ** mi
2640: 67 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72  ght expect their
2650: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65   registers to be
2660: 20 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73   preserved acros
2670: 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61  s an OP_Yield, a
2680: 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75  nd.  ** that cou
2690: 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d  ld cause problem
26a0: 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s if two or more
26b0: 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65   co-routines are
26c0: 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
26d0: 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72    ** temporary r
26e0: 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  egister..  */.  
26f0: 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  v->pParse->nTemp
2700: 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50  Reg = 0;.  v->pP
2710: 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2720: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  = 0;.}../*.** Cr
2730: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
2740: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e  lic label for an
2750: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
2760: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a  t has yet to be.
2770: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73  ** coded.  The s
2780: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73  ymbolic label is
2790: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e   really just a n
27a0: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20  egative number. 
27b0: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61   The.** label ca
27c0: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  n be used as the
27d0: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20   P2 value of an 
27e0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65  operation.  Late
27f0: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  r, when.** the l
2800: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64  abel is resolved
2810: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61   to a specific a
2820: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45  ddress, the VDBE
2830: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68   will scan.** th
2840: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74  rough its operat
2850: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61  ion list and cha
2860: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  nge all values o
2870: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68  f P2 which match
2880: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e  .** the label in
2890: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20  to the resolved 
28a0: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  address..**.** T
28b0: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68  he VDBE knows th
28c0: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73  at a P2 value is
28d0: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65   a label because
28e0: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61   labels are.** a
28f0: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61  lways negative a
2900: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65  nd P2 values are
2910: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e   suppose to be n
2920: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
2930: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76  Hence, a negativ
2940: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  e P2 value is a 
2950: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79  label that has y
2960: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65  et to be resolve
2970: 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  d..**.** Zero is
2980: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
2990: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
29a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
29b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20  eMakeLabel(Vdbe 
29c0: 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20  *v){.  Parse *p 
29d0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
29e0: 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  nt i = p->nLabel
29f0: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  ++;.  assert( v-
2a00: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2a10: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
2a20: 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20   (i & (i-1))==0 
2a30: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
2a40: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
2a50: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
2a60: 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20   p->aLabel, .   
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65      (i*2+1)*size
2aa0: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
2ab0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2ac0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
2ad0: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
2ae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44  .  }.  return AD
2af0: 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  DR(i);.}../*.** 
2b00: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
2b10: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
2b20: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
2b30: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
2b40: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
2b50: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
2b60: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
2b70: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
2b80: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
2b90: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
2ba0: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
2bb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
2bc0: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
2bd0: 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72  v, int x){.  Par
2be0: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
2bf0: 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44  e;.  int j = ADD
2c00: 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  R(x);.  assert( 
2c10: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2c20: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
2c30: 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62  ssert( j<p->nLab
2c40: 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
2c50: 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  j>=0 );.  if( p-
2c60: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2c70: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d  ->aLabel[j] = v-
2c80: 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >nOp;.  }.}../*.
2c90: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
2ca0: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
2cb0: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65   only be run one
2cc0: 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
2cd0: 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c  qlite3VdbeRunOnl
2ce0: 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a  yOnce(Vdbe *p){.
2cf0: 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65    p->runOnlyOnce
2d00: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
2d10: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
2d20: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
2d30: 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c  y be run multipl
2d40: 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e times..*/.void
2d50: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
2d60: 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  able(Vdbe *p){. 
2d70: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
2d80: 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 0;.}..#ifdef S
2d90: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
2da0: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
2db0: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
2dc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2dd0: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
2de0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
2df0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2e00: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
2e10: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
2e20: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
2e30: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
2e40: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
2e50: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
2e60: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
2e70: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
2e80: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
2e90: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2ea0: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
2eb0: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2ec0: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
2ed0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2ee0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
2ef0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
2f20: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
2f30: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
2f40: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
2f50: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
2f60: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
2f70: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
2f80: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
2f90: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
2fa0: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
2fb0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
2fc0: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
2fd0: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
2fe0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
2ff0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
3000: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
3010: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3020: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
3030: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
3040: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
3050: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
3060: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
3070: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
3080: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3090: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
30a0: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
30b0: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
30c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
30d0: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
30e0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
30f0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3110: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
3120: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
3130: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
3140: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
3150: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
3160: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
3170: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
3180: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
3190: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
31a0: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
31b0: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
31c0: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
31d0: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
31e0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
31f0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
3200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
3210: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
3220: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
3230: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
3240: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
3250: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
3260: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
3270: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
3280: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
3290: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
32a0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
32b0: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
32c0: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
32d0: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
32e0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
32f0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
3300: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
3310: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
3320: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
3330: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
3340: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
3350: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3360: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
3370: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
3380: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
3390: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
33a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
33b0: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
33c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
33d0: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
33e0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
33f0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
3400: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
3410: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
3420: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
3430: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
3440: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
3450: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
3460: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
3470: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
3480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3490: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
34a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
34b0: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
34c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
34d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34e0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
34f0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
3500: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
3510: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
3520: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
3530: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
3540: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
3550: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
3560: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
3570: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
3580: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
3590: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
35a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
35b0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
35c0: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
35d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
35e0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
35f0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
3600: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
3610: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3620: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
3630: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
3640: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
3650: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
3660: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
3670: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
3680: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
3690: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
36a0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
36b0: 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 54     *  OP_CreateT
36c0: 61 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74  able and OP_Init
36d0: 43 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72 20 43  Coroutine (for C
36e0: 52 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53  REATE TABLE AS S
36f0: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
3700: 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74   Then check that
3710: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
3720: 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20  rse.mayAbort is 
3730: 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42  true if an.** AB
3740: 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77  ORT may be throw
3750: 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  n, or false othe
3760: 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72  rwise. Return tr
3770: 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a  ue if it does.**
3780: 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65   match, or false
3790: 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73   otherwise. This
37a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74   function is int
37b0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
37c0: 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61   as.** part of a
37d0: 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  n assert stateme
37e0: 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c  nt in the compil
37f0: 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a  er. Similar to:.
3800: 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20  **.**   assert( 
3810: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
3820: 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  tMayAbort(pParse
3830: 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d  ->pVdbe, pParse-
3840: 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f  >mayAbort) );.*/
3850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3860: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56  AssertMayAbort(V
3870: 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41  dbe *v, int mayA
3880: 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73  bort){.  int has
3890: 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Abort = 0;.  int
38a0: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20   hasFkCounter = 
38b0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61  0;.  int hasCrea
38c0: 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69  teTable = 0;.  i
38d0: 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74  nt hasInitCorout
38e0: 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  ine = 0;.  Op *p
38f0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72  Op;.  VdbeOpIter
3900: 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74   sIter;.  memset
3910: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
3920: 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49  of(sIter));.  sI
3930: 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68  ter.v = v;..  wh
3940: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
3950: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21  erNext(&sIter))!
3960: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  =0 ){.    int op
3970: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
3980: 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  de;.    if( opco
3990: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c  de==OP_Destroy |
39a0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  | opcode==OP_VUp
39b0: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
39c0: 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20  OP_VRename .    
39d0: 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50   || ((opcode==OP
39e0: 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d  _Halt || opcode=
39f0: 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20  =OP_HaltIfNull) 
3a00: 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d  .      && ((pOp-
3a10: 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >p1&0xff)==SQLIT
3a20: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
3a30: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
3a40: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
3a50: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
3a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3a70: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
3a80: 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  ==OP_CreateTable
3a90: 20 29 20 68 61 73 43 72 65 61 74 65 54 61 62 6c   ) hasCreateTabl
3aa0: 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6f  e = 1;.    if( o
3ab0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f  pcode==OP_InitCo
3ac0: 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49 6e 69  routine ) hasIni
3ad0: 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a  tCoroutine = 1;.
3ae0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3af0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
3b00: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
3b10: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20  OP_FkCounter && 
3b20: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f  pOp->p1==0 && pO
3b30: 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20  p->p2==1 ){.    
3b40: 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d    hasFkCounter =
3b50: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
3b60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
3b70: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
3b80: 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20  r.apSub);..  /* 
3b90: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 68  Return true if h
3ba0: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
3bb0: 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f  t. Or if a mallo
3bc0: 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  c failure occurr
3bd0: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
3be0: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
3bf0: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
3c00: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
3c10: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
3c20: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
3c30: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
3c40: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
3c50: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
3c60: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
3c70: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
3c80: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
3c90: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
3ca0: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
3cb0: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
3cc0: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
3cd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
3ce0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
3cf0: 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74  rt || hasFkCount
3d00: 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
3d10: 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54 61   || (hasCreateTa
3d20: 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f  ble && hasInitCo
3d30: 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65  routine) );.}.#e
3d40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
3d50: 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74  EBUG - the sqlit
3d60: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
3d70: 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  () function */..
3d80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3d90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
3da0: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
3db0: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
3dc0: 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20  d.  It loops.** 
3dd0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
3de0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65  opcodes and fixe
3df0: 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c  s up some detail
3e00: 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72  s..**.** (1) For
3e10: 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72   each jump instr
3e20: 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65  uction with a ne
3e30: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
3e40: 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20  (a label).**    
3e50: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20   resolve the P2 
3e60: 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75  value to an actu
3e70: 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  al address..**.*
3e80: 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68  * (2) Compute th
3e90: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3ea0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73   of arguments us
3eb0: 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75  ed by any SQL fu
3ec0: 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e  nction.**     an
3ed0: 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c  d store that val
3ee0: 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41  ue in *pMaxFuncA
3ef0: 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55  rgs..**.** (3) U
3f00: 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72  pdate the Vdbe.r
3f10: 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65  eadOnly and Vdbe
3f20: 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73  .bIsReader flags
3f30: 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a   to accurately.*
3f40: 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77  *     indicate w
3f50: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
3f60: 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61   statement actua
3f70: 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  lly does..**.** 
3f80: 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  (4) Initialize t
3f90: 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70  he p4.xAdvance p
3fa0: 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65  ointer on opcode
3fb0: 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a  s that use it..*
3fc0: 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d  *.** (5) Reclaim
3fd0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
3fe0: 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e  cated for storin
3ff0: 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20  g labels..**.** 
4000: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
4010: 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20  l only function 
4020: 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68 65  correctly if the
4030: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
4040: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69  enerator.** scri
4050: 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65 20 6f  pt numbers the o
4060: 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74 6c 79  pcodes correctly
4070: 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 74 68  .  Changes to th
4080: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
4090: 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65  be.** coordinate
40a0: 64 20 77 69 74 68 20 63 68 61 6e 67 65 73 20 74  d with changes t
40b0: 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e  o mkopcodeh.tcl.
40c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
40d0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
40e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
40f0: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
4100: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
4110: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
4120: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
4130: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
4140: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
4150: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
4160: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
4170: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
4180: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f  Reader = 0;.  pO
4190: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  p = &p->aOp[p->n
41a0: 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31  Op-1];.  while(1
41b0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  ){..    /* Only 
41c0: 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e 64  JUMP opcodes and
41d0: 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73 74 20   the short list 
41e0: 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63 6f 64  of special opcod
41f0: 65 73 20 69 6e 20 74 68 65 20 73 77 69 74 63 68  es in the switch
4200: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65  .    ** below ne
4210: 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
4220: 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f  red.  The mkopco
4230: 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f  deh.tcl generato
4240: 72 20 73 63 72 69 70 74 20 67 72 6f 75 70 73 0a  r script groups.
4250: 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65      ** all these
4260: 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74 68 65   opcodes togethe
4270: 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f 6e 74  r near the front
4280: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 6c   of the opcode l
4290: 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a  ist.  Skip.    *
42a0: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74 68 61  * any opcode tha
42b0: 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
42c0: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 76 69  processing by vi
42d0: 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66 61 63  rtual of the fac
42e0: 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 74  t that.    ** it
42f0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
4300: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f  SQLITE_MX_JUMP_O
4310: 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65 72 66  PCODE, as a perf
4320: 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
4330: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
4340: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
4350: 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  <=SQLITE_MX_JUMP
4360: 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20 20 20  _OPCODE ){.     
4370: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
4380: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
4390: 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61  codeh.tcl when a
43a0: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
43b0: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65 73  g.      ** cases
43c0: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
43d0: 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  h! */.      swit
43e0: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
43f0: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
4400: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
4410: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
4420: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
4430: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
4440: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
4450: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20  thru */.        
4460: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
4470: 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20  P_AutoCommit:.  
4480: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
4490: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
44a0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
44b0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
44c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
44d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
44e0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20  _OMIT_WAL.      
44f0: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
4500: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
4510: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
4520: 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63 61 73  uum:.        cas
4530: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
4540: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  : {.          p-
4550: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
4560: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52           p->bIsR
4570: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
4580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4590: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
45a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
45b0: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63  LTABLE.        c
45c0: 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20  ase OP_VUpdate: 
45d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
45e0: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
45f0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
4600: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20  p->p2;.         
4610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4620: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
4630: 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20  P_VFilter: {.   
4640: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
4650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4660: 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e  (pOp - p->aOp) >
4670: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20  = 3 );.         
4680: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
4690: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
46a0: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ger );.         
46b0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
46c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
46d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
46e0: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
46f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4700: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4710: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4720: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4730: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
4740: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
4750: 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20  rterNext: {.    
4760: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
4770: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
4780: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
4790: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
47a0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
47b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
47c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
47d0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a    case OP_Prev:.
47e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
47f0: 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20  PrevIfOpen: {.  
4800: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
4810: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
4820: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
4830: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
4840: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
4850: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 62  NCE;.          b
4860: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4880: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
4890: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
48a0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
48b0: 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70  MP)!=0 && pOp->p
48c0: 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  2<0 ){.        a
48d0: 73 73 65 72 74 28 20 41 44 44 52 28 70 4f 70 2d  ssert( ADDR(pOp-
48e0: 3e 70 32 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61  >p2)<pParse->nLa
48f0: 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 70  bel );.        p
4900: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
4910: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a  ADDR(pOp->p2)];.
4920: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4930: 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f    if( pOp==p->aO
4940: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  p ) break;.    p
4950: 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Op--;.  }.  sqli
4960: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
4970: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29   pParse->aLabel)
4980: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  ;.  pParse->aLab
4990: 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  el = 0;.  pParse
49a0: 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->nLabel = 0;.  
49b0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20  *pMaxFuncArgs = 
49c0: 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65  nMaxArgs;.  asse
49d0: 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
49e0: 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c  !=0 || DbMaskAll
49f0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
4a00: 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  k) );.}../*.** R
4a10: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
4a20: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
4a30: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
4a40: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
4a50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4a60: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
4a70: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
4a80: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4a90: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
4aa0: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
4ab0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  ** Verify that a
4ac0: 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65  t least N opcode
4ad0: 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c   slots are avail
4ae0: 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75  able in p withou
4af0: 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d  t.** having to m
4b00: 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73  alloc for more s
4b10: 70 61 63 65 20 28 65 78 63 65 70 74 20 77 68 65  pace (except whe
4b20: 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  n compiled using
4b30: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  .** SQLITE_TEST_
4b40: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e  REALLOC_STRESS).
4b50: 20 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65    This interface
4b60: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
4b70: 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65  testing.** to ve
4b80: 72 69 66 79 20 74 68 61 74 20 63 65 72 74 61 69  rify that certai
4b90: 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  n calls to sqlit
4ba0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
4bb0: 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66  ) can never.** f
4bc0: 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d  ail due to a OOM
4bd0: 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65   fault and hence
4be0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
4bf0: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73   value from.** s
4c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
4c10: 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79  ist() will alway
4c20: 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a  s be non-NULL..*
4c30: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
4c40: 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21  LITE_DEBUG) && !
4c50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
4c60: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
4c70: 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  SS).void sqlite3
4c80: 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c  VdbeVerifyNoMall
4c90: 6f 63 52 65 71 75 69 72 65 64 28 56 64 62 65 20  ocRequired(Vdbe 
4ca0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  *p, int N){.  as
4cb0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e  sert( p->nOp + N
4cc0: 20 3c 3d 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e   <= p->pParse->n
4cd0: 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e  OpAlloc );.}.#en
4ce0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66  dif../*.** Verif
4cf0: 79 20 74 68 61 74 20 74 68 65 20 56 4d 20 70 61  y that the VM pa
4d00: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
4d10: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
4d20: 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e  ot contain.** an
4d30: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
4d40: 63 6f 64 65 2e 20 46 61 69 6c 20 61 6e 20 61 73  code. Fail an as
4d50: 73 65 72 74 28 29 20 69 66 20 69 74 20 64 6f 65  sert() if it doe
4d60: 73 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  s. This is used.
4d70: 2a 2a 20 62 79 20 63 6f 64 65 20 69 6e 20 70 72  ** by code in pr
4d80: 61 67 6d 61 2e 63 20 74 6f 20 65 6e 73 75 72 65  agma.c to ensure
4d90: 20 74 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d   that the implem
4da0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 63 65 72 74  entation of cert
4db0: 61 69 6e 0a 2a 2a 20 70 72 61 67 6d 61 73 20 63  ain.** pragmas c
4dc0: 6f 6d 70 6f 72 74 73 20 77 69 74 68 20 74 68 65  omports with the
4dd0: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
4de0: 20 69 6e 20 74 68 65 20 6d 6b 70 72 61 67 6d 61   in the mkpragma
4df0: 74 61 62 2e 74 63 6c 0a 2a 2a 20 73 63 72 69 70  tab.tcl.** scrip
4e00: 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  t..*/.#if define
4e10: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
4e20: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
4e30: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
4e40: 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c  STRESS).void sql
4e50: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
4e60: 52 65 73 75 6c 74 52 6f 77 28 56 64 62 65 20 2a  ResultRow(Vdbe *
4e70: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  p){.  int i;.  f
4e80: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
4e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
4ea0: 72 74 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  rt( p->aOp[i].op
4eb0: 63 6f 64 65 21 3d 4f 50 5f 52 65 73 75 6c 74 52  code!=OP_ResultR
4ec0: 6f 77 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ow );.  }.}.#end
4ed0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
4ee0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
4ef0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4f00: 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65   array of opcode
4f10: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4f20: 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61  h.** the Vdbe pa
4f30: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
4f40: 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69  t argument. It i
4f50: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
4f60: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
4f70: 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74  to arrange for t
4f80: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61  he returned arra
4f90: 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c  y to be eventual
4fa0: 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74  ly freed using t
4fb0: 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f  he .** vdbeFreeO
4fc0: 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f  pArray() functio
4fd0: 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  n..**.** Before 
4fe0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70  returning, *pnOp
4ff0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
5000: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
5010: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
5020: 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c  .** array. Also,
5030: 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65   *pnMaxArg is se
5040: 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20  t to the larger 
5050: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
5060: 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65  alue and .** the
5070: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
5080: 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  es in the Vdbe.a
5090: 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71  pArg[] array req
50a0: 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65  uired to execute
50b0: 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   the .** returne
50c0: 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64  d program..*/.Vd
50d0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
50e0: 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62  eTakeOpArray(Vdb
50f0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c  e *p, int *pnOp,
5100: 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b   int *pnMaxArg){
5110: 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d  .  VdbeOp *aOp =
5120: 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72   p->aOp;.  asser
5130: 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62  t( aOp && !p->db
5140: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5150: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
5160: 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  at sqlite3VdbeUs
5170: 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f  esBtree() was no
5180: 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  t called on this
5190: 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   VM */.  assert(
51a0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
51b0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
51c0: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
51d0: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
51e0: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
51f0: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
5200: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
5210: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
5220: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
5230: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
5240: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
5250: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
5260: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
5270: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72   operation inser
5280: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a  ted..**.** Non-z
5290: 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73  ero P2 arguments
52a0: 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   to jump instruc
52b0: 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61  tions are automa
52c0: 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64  tically adjusted
52d0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
52e0: 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72  jump target is r
52f0: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66  elative to the f
5300: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  irst operation i
5310: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65  nserted..*/.Vdbe
5320: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  Op *sqlite3VdbeA
5330: 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65  ddOpList(.  Vdbe
5340: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5350: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
5360: 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70  opcodes to the p
5370: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
5380: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20  t */.  int nOp, 
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
53b0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20   opcodes to add 
53c0: 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20  */.  VdbeOpList 
53d0: 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20  const *aOp,     
53e0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73    /* The opcodes
53f0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
5400: 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20    int iLineno   
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5420: 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69  * Source-file li
5430: 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72  ne number of fir
5440: 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a  st opcode */.){.
5450: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
5460: 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74  p *pOut, *pFirst
5470: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e  ;.  assert( nOp>
5480: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5490: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
54a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
54b0: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
54c0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
54d0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
54e0: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
54f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5500: 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74  .  pFirst = pOut
5510: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
5520: 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p];.  for(i=0; i
5530: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b  <nOp; i++, aOp++
5540: 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70  , pOut++){.    p
5550: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f  Out->opcode = aO
5560: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70  p->opcode;.    p
5570: 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70  Out->p1 = aOp->p
5580: 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20  1;.    pOut->p2 
5590: 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61  = aOp->p2;.    a
55a0: 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d  ssert( aOp->p2>=
55b0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71  0 );.    if( (sq
55c0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
55d0: 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[aOp->opcode]
55e0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
55f0: 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29  0 && aOp->p2>0 )
5600: 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  {.      pOut->p2
5610: 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   += p->nOp;.    
5620: 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d  }.    pOut->p3 =
5630: 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f   aOp->p3;.    pO
5640: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
5650: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75  NOTUSED;.    pOu
5660: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
5670: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
5680: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5690: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
56a0: 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a  ENTS.    pOut->z
56b0: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
56c0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
56d0: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
56e0: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69      pOut->iSrcLi
56f0: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a  ne = iLineno+i;.
5700: 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29  #else.    (void)
5710: 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a  iLineno;.#endif.
5720: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5730: 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  BUG.    if( p->d
5740: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5750: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
5760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5770: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
5780: 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f  i+p->nOp, &p->aO
5790: 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20  p[i+p->nOp]);.  
57a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
57b0: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
57c0: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
57d0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
57e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
57f0: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
5800: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
5810: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
5820: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
5830: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
5840: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
5850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5860: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
5870: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
58a0: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
58b0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
58c0: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
58d0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
58e0: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
58f0: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
5900: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
5910: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
5920: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
5930: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
5940: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
5950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
5960: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
5970: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
5980: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
59b0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
59c0: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
59d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
59e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
59f0: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
5a00: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
5a10: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
5a20: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
5a30: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
5a40: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
5a50: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
5a60: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
5a70: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
5a80: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
5a90: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
5aa0: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
5ab0: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
5ac0: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
5ad0: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
5ae0: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
5af0: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
5b00: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
5b10: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
5b20: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
5b30: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
5b40: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
5b50: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
5b60: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
5b70: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
5b80: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
5b90: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
5ba0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
5bb0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
5bc0: 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50  the opcode, or P
5bd0: 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35  1, P2, P3, or P5
5be0: 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72   operands.** for
5bf0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
5c00: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
5c10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5c20: 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  geOpcode(Vdbe *p
5c30: 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20 69  , u32 addr, u8 i
5c40: 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71  NewOpcode){.  sq
5c50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5c60: 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d  ,addr)->opcode =
5c70: 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76   iNewOpcode;.}.v
5c80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5c90: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
5ca0: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5cb0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5cc0: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
5cd0: 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p1 = val;.}.voi
5ce0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
5cf0: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75  ngeP2(Vdbe *p, u
5d00: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
5d10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5d20: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5d30: 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  2 = val;.}.void 
5d40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5d50: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP3(Vdbe *p, u32
5d60: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
5d70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
5d80: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20  tOp(p,addr)->p3 
5d90: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
5da0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5db0: 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20 70  5(Vdbe *p, u16 p
5dc0: 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  5){.  assert( p-
5dd0: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d  >nOp>0 || p->db-
5de0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
5df0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20  .  if( p->nOp>0 
5e00: 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  ) p->aOp[p->nOp-
5e10: 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f  1].p5 = p5;.}../
5e20: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5e30: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
5e40: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
5e50: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
5e60: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
5e70: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
5e80: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
5e90: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
5ea0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5eb0: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
5ec0: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
5ed0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
5ee0: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
5ef0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
5f00: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
5f10: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
5f20: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
5f30: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
5f40: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
5f50: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
5f60: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
5f70: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
5f80: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
5f90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
5fa0: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
5fb0: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
5fc0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5fd0: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
5fe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5ff0: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
6000: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
6010: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
6020: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
6030: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
6040: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
6050: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
6060: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
6070: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
6080: 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62  4Mem(sqlite3 *db
6090: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28  , Mem *p){.  if(
60a0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
60b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
60c0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
60d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
60e0: 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53  , p);.}.static S
60f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
6100: 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74  oid freeP4FuncCt
6110: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  x(sqlite3 *db, s
6120: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6130: 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65  p){.  freeEpheme
6140: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
6150: 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 73 71 6c  p->pFunc);.  sql
6160: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6170: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
6180: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
6190: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
61a0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73   void *p4){.  as
61b0: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77  sert( db );.  sw
61c0: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
61d0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
61e0: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  CTX: {.      fre
61f0: 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28  eP4FuncCtx(db, (
6200: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
6210: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6220: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6230: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63  e P4_REAL:.    c
6240: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
6250: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
6260: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  C:.    case P4_I
6270: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
6280: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6290: 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72  b, p4);.      br
62a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
62b0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
62c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
62d0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
62e0: 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ) sqlite3KeyInfo
62f0: 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29  Unref((KeyInfo*)
6300: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
6310: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
6320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
6330: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
6340: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
6350: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6360: 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a  elete(db, (Expr*
6370: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6380: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
6390: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
63a0: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  DEF: {.      fre
63b0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
63c0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
63d0: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
63e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
63f0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
6400: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
6410: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
6420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
6430: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
6440: 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20  alue*)p4);.     
6450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6460: 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d  freeP4Mem(db, (M
6470: 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d  em*)p4);.      }
6480: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6490: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
64a0: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 69  VTAB : {.      i
64b0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
64c0: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
64d0: 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62  VtabUnlock((VTab
64e0: 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  le *)p4);.      
64f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
6510: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
6520: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
6530: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
6540: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
6550: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
6560: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
6570: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
6580: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
6590: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
65a0: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
65b0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
65c0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
65d0: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
65e0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
65f0: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
6600: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
6610: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
6620: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
6630: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
6640: 20 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f   ) freeP4(db, pO
6650: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
6660: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
6670: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
6680: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
6690: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
66a0: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
66b0: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
66c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
66d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
66e0: 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  Op);.}../*.** Li
66f0: 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  nk the SubProgra
6700: 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  m object passed 
6710: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6720: 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20  gument into the 
6730: 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61  linked.** list a
6740: 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72  t Vdbe.pSubProgr
6750: 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73  am. This list is
6760: 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20   used to delete 
6770: 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a  all sub-program.
6780: 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20  ** objects when 
6790: 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e  the VM is no lon
67a0: 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
67b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
67c0: 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28  eLinkSubProgram(
67d0: 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62  Vdbe *pVdbe, Sub
67e0: 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70  Program *p){.  p
67f0: 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d  ->pNext = pVdbe-
6800: 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64  >pProgram;.  pVd
6810: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70  be->pProgram = p
6820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
6830: 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20  e the opcode at 
6840: 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f  addr into OP_Noo
6850: 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  p.*/.int sqlite3
6860: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
6870: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
6880: 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70  dr){.  VdbeOp *p
6890: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  Op;.  if( p->db-
68a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
68b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
68c0: 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61  rt( addr>=0 && a
68d0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
68e0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
68f0: 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70 2d  dr];.  freeP4(p-
6900: 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  >db, pOp->p4type
6910: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
6920: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
6930: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d  _NOTUSED;.  pOp-
6940: 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.z = 0;.  pOp
6950: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
6960: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  op;.  return 1;.
6970: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
6980: 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22  last opcode is "
6990: 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  op" and it is no
69a0: 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  t a jump destina
69b0: 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  tion,.** then re
69c0: 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e  move it.  Return
69d0: 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c   true if and onl
69e0: 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77  y if an opcode w
69f0: 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  as removed..*/.i
6a00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nt sqlite3VdbeDe
6a10: 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28  letePriorOpcode(
6a20: 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b  Vdbe *p, u8 op){
6a30: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20  .  if( p->nOp>0 
6a40: 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  && p->aOp[p->nOp
6a50: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29  -1].opcode==op )
6a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
6a70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
6a80: 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31  Noop(p, p->nOp-1
6a90: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
6ab0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6ac0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
6ad0: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
6ae0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
6af0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
6b00: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
6b10: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
6b20: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
6b30: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
6b40: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
6b50: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
6b60: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
6b70: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
6b80: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
6b90: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
6ba0: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
6bb0: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
6bc0: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
6bd0: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
6be0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
6bf0: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
6c00: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
6c10: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6c20: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
6c30: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
6c40: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
6c50: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
6c60: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
6c70: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
6c80: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
6c90: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
6ca0: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
6cb0: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
6cc0: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
6cd0: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
6ce0: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
6cf0: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
6d00: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
6d10: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
6d20: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
6d30: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
6d40: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
6d50: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
6d60: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
6d70: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
6d80: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
6d90: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
6da0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
6db0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
6dc0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
6dd0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65  TE_NOINLINE vdbe
6de0: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20  ChangeP4Full(.  
6df0: 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70  Vdbe *p,.  Op *p
6e00: 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Op,.  const char
6e10: 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29   *zP4,.  int n.)
6e20: 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  {.  if( pOp->p4t
6e30: 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50  ype ){.    freeP
6e40: 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34  4(p->db, pOp->p4
6e50: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
6e60: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6e70: 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  e = 0;.    pOp->
6e80: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  p4.p = 0;.  }.  
6e90: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73  if( n<0 ){.    s
6ea0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6eb0: 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20  P4(p, (int)(pOp 
6ec0: 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20  - p->aOp), zP4, 
6ed0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
6ee0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
6ef0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6f00: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
6f10: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
6f20: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
6f30: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
6f40: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
6f50: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  MIC;.  }.}.void 
6f60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6f70: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
6f80: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
6f90: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
6fa0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
6fb0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
6fc0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
6fd0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
6fe0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
6ff0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
7000: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
7010: 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p!=0 || db->mall
7020: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
7030: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7040: 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21  ed ){.    if( n!
7050: 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65 50  =P4_VTAB ) freeP
7060: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
7070: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
7080: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7090: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
70a0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
70b0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
70c0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
70d0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
70e0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
70f0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
7100: 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70  .  if( n>=0 || p
7110: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
7120: 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75    vdbeChangeP4Fu
7130: 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20  ll(p, pOp, zP4, 
7140: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  n);.    return;.
7150: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f    }.  if( n==P4_
7160: 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20  INT32 ){.    /* 
7170: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20  Note: this cast 
7180: 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65  is safe, because
7190: 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61   the origin data
71a0: 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e   point was an in
71b0: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61  t.    ** that wa
71c0: 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e  s cast to a (con
71d0: 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20  st char *). */. 
71e0: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53     pOp->p4.i = S
71f0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
7200: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
7210: 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33  p4type = P4_INT3
7220: 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  2;.  }else if( z
7230: 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  P4!=0 ){.    ass
7240: 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20  ert( n<0 );.    
7250: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
7260: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
7270: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
7280: 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66  d char)n;.    if
7290: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73  ( n==P4_VTAB ) s
72a0: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
72b0: 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20  VTable*)zP4);.  
72c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
72d0: 65 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  e the P4 operand
72e0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
72f0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
7300: 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74  ruction .** to t
7310: 68 65 20 76 61 6c 75 65 20 64 65 66 69 6e 65 64  he value defined
7320: 20 62 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74   by the argument
7330: 73 2e 20 20 54 68 69 73 20 69 73 20 61 20 68 69  s.  This is a hi
7340: 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72 73  gh-speed.** vers
7350: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
7360: 62 65 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a  beChangeP4()..**
7370: 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61  .** The P4 opera
7380: 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  nd must not have
7390: 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
73a0: 20 64 65 66 69 6e 65 64 2e 20 20 41 6e 64 20 74   defined.  And t
73b0: 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73  he new.** P4 mus
73c0: 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54 33  t not be P4_INT3
73d0: 32 2e 20 20 55 73 65 20 73 71 6c 69 74 65 33 56  2.  Use sqlite3V
73e0: 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 69 6e  dbeChangeP4() in
73f0: 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68   either of.** th
7400: 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f  ose cases..*/.vo
7410: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 70  id sqlite3VdbeAp
7420: 70 65 6e 64 50 34 28 56 64 62 65 20 2a 70 2c 20  pendP4(Vdbe *p, 
7430: 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e  void *pP4, int n
7440: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
7450: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 50  ;.  assert( n!=P
7460: 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d 50 34  4_INT32 && n!=P4
7470: 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72  _VTAB );.  asser
7480: 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28  t( n<=0 );.  if(
7490: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
74a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 72 65 65  iled ){.    free
74b0: 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34  P4(p->db, n, pP4
74c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
74d0: 61 73 73 65 72 74 28 20 70 50 34 21 3d 30 20 29  assert( pP4!=0 )
74e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
74f0: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f  >nOp>0 );.    pO
7500: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  p = &p->aOp[p->n
7510: 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  Op-1];.    asser
7520: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
7530: 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20  P4_NOTUSED );.  
7540: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7550: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  n;.    pOp->p4.p
7560: 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pP4;.  }.}../
7570: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20  *.** Set the P4 
7580: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
7590: 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64  ntly added opcod
75a0: 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f  e to the KeyInfo
75b0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65   for the.** inde
75c0: 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  x given..*/.void
75d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
75e0: 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  4KeyInfo(Parse *
75f0: 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
7600: 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Idx){.  Vdbe *v 
7610: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7620: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
7630: 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  Info;.  assert( 
7640: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
7650: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 70  ( pIdx!=0 );.  p
7660: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
7670: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
7680: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
7690: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 20   if( pKeyInfo ) 
76a0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
76b0: 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c  dP4(v, pKeyInfo,
76c0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a   P4_KEYINFO);.}.
76d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
76e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
76f0: 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61  MMENTS./*.** Cha
7700: 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  nge the comment 
7710: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
7720: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
7730: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
7740: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
7750: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
7760: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
7770: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
7780: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
7790: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
77a0: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
77b0: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
77c0: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
77d0: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
77e0: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
77f0: 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28  id vdbeVComment(
7800: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
7810: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
7820: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73  _list ap){.  ass
7830: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
7840: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
7850: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
7860: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
7870: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
7880: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
7890: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
78a0: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
78b0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29  assert( p->aOp )
78c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
78d0: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  ree(p->db, p->aO
78e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
78f0: 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  ment);.    p->aO
7900: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
7910: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d  ment = sqlite3VM
7920: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
7930: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a  ormat, ap);.  }.
7940: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7950: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
7960: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
7970: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
7980: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
7990: 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74  ( p ){.    va_st
79a0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
79b0: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
79c0: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
79d0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
79e0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
79f0: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
7a00: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
7a10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
7a20: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
7a30: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
7a40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
7a50: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e  beAddOp0(p, OP_N
7a60: 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61  oop);.    va_sta
7a70: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
7a80: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
7a90: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
7aa0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
7ab0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
7ac0: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23   /* NDEBUG */..#
7ad0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
7ae0: 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a  E_COVERAGE./*.**
7af0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69   Set the value i
7b00: 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66  f the iSrcLine f
7b10: 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65  ield for the pre
7b20: 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e  viously coded in
7b30: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
7b40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
7b50: 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65  tLineNumber(Vdbe
7b60: 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b   *v, int iLine){
7b70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
7b80: 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c  tOp(v,-1)->iSrcL
7b90: 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23  ine = iLine;.}.#
7ba0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7bb0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f  VDBE_COVERAGE */
7bc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7bd0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
7be0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
7bf0: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
7c00: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
7c10: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
7c20: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
7c30: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
7c40: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7c50: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
7c60: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
7c70: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
7c80: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
7c90: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
7ca0: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
7cb0: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
7cc0: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
7cd0: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
7ce0: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
7cf0: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
7d00: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
7d10: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
7d20: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
7d30: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
7d40: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
7d50: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
7d60: 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d  .** after an OOM
7d70: 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68   fault without h
7d80: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
7d90: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
7da0: 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69  urn from .** thi
7db0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
7dc0: 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42  alid pointer.  B
7dd0: 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ut because the d
7de0: 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30  ummy.opcode is 0
7df0: 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20  ,.** dummy will 
7e00: 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e  never be written
7e10: 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65   to.  This is ve
7e20: 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69  rified by code i
7e30: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  nspection and.**
7e40: 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68   by running with
7e50: 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64   Valgrind..*/.Vd
7e60: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
7e70: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
7e80: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
7e90: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
7ea0: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
7eb0: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
7ec0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
7ed0: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
7ee0: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
7ef0: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
7f00: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
7f10: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
7f20: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
7f30: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
7f40: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
7f50: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
7f60: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
7f70: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
7f80: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
7f90: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
7fa0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
7fb0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
7fc0: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
7fd0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
7fe0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7ff0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
8000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8010: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
8020: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
8030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
8040: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
8050: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  ];.  }.}..#if de
8060: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8070: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
8080: 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ENTS)./*.** Retu
8090: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  rn an integer va
80a0: 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  lue for one of t
80b0: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
80c0: 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a   the opcode pOp.
80d0: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
80e0: 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f   character c..*/
80f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
8100: 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63  slateP(char c, c
8110: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20  onst Op *pOp){. 
8120: 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65   if( c=='1' ) re
8130: 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  turn pOp->p1;.  
8140: 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74  if( c=='2' ) ret
8150: 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69  urn pOp->p2;.  i
8160: 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75  f( c=='3' ) retu
8170: 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  rn pOp->p3;.  if
8180: 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72  ( c=='4' ) retur
8190: 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72  n pOp->p4.i;.  r
81a0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d  eturn pOp->p5;.}
81b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
81c0: 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  a string for the
81d0: 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64   "comment" field
81e0: 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64   of a VDBE opcod
81f0: 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e listing..**.**
8200: 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66   The Synopsis: f
8210: 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73  ield in comments
8220: 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73   in the vdbe.c s
8230: 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20  ource file gets 
8240: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
8250: 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20  an extra string 
8260: 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64  that is appended
8270: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f   to the sqlite3O
8280: 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e  pcodeName().  In
8290: 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20   the.** absence 
82a0: 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74  of other comment
82b0: 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73  s, this synopsis
82c0: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d   becomes the com
82d0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f  ment on the opco
82e0: 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e  de..** Some tran
82f0: 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a  slation occurs:.
8300: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22  **.**       "PX"
8310: 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22        ->  "r[X]"
8320: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
8330: 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  "   ->  "r[X..X+
8340: 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22  Y-1]"  or "r[x]"
8350: 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a   if y is 0 or 1.
8360: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b  **       "PX@PY+
8370: 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59  1" ->  "r[X..X+Y
8380: 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20  ]"    or "r[x]" 
8390: 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20  if y is 0.**    
83a0: 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20     "PY..PY"  -> 
83b0: 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20   "r[X..Y]"      
83c0: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d  or "r[x]" if y<=
83d0: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  x.*/.static int 
83e0: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a  displayComment(.
83f0: 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c    const Op *pOp,
8400: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
8410: 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74  de to be comment
8420: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
8430: 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72  ar *zP4,   /* Pr
8440: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
8450: 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a  d value for P4 *
8460: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  /.  char *zTemp,
8470: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
8480: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20  result here */. 
8490: 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20   int nTemp      
84a0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61      /* Space ava
84b0: 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b  ilable in zTemp[
84c0: 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ] */.){.  const 
84d0: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20  char *zOpName;. 
84e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
84f0: 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f  nopsis;.  int nO
8500: 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c  pName;.  int ii,
8510: 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74   jj;.  char zAlt
8520: 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20  [50];.  zOpName 
8530: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
8540: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
8550: 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  nOpName = sq
8560: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
8570: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f  pName);.  if( zO
8580: 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d  pName[nOpName+1]
8590: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
85a0: 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Com = 0;.    cha
85b0: 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73  r c;.    zSynops
85c0: 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20  is = zOpName += 
85d0: 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20  nOpName + 1;.   
85e0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
85f0: 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d  nopsis,"IF ",3)=
8600: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
8610: 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
8620: 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20  _STOREP2 ){.    
8630: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8640: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74  intf(sizeof(zAlt
8650: 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20  ), zAlt, "r[P2] 
8660: 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73  = (%s)", zSynops
8670: 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c  is+3);.      }el
8680: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8690: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
86a0: 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c  eof(zAlt), zAlt,
86b0: 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22   "if %s goto P2"
86c0: 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a  , zSynopsis+3);.
86d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
86e0: 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a  ynopsis = zAlt;.
86f0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
8700: 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d  =jj=0; jj<nTemp-
8710: 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70  1 && (c = zSynop
8720: 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b  sis[ii])!=0; ii+
8730: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +){.      if( c=
8740: 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='P' ){.        
8750: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b  c = zSynopsis[++
8760: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii];.        if(
8770: 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20   c=='4' ){.     
8780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8790: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
87a0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
87b0: 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  zP4);.        }e
87c0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29  lse if( c=='X' )
87d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
87e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
87f0: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
8800: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
8810: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
8820: 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20   seenCom = 1;.  
8830: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8840: 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20         int v1 = 
8850: 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f  translateP(c, pO
8860: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  p);.          in
8870: 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20  t v2;.          
8880: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8890: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
88a0: 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a  +jj, "%d", v1);.
88b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
88c0: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
88d0: 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d  ii+1, "@P", 2)==
88e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
88f0: 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   ii += 3;.      
8900: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
8910: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
8920: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  p+jj);.         
8930: 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74     v2 = translat
8940: 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d  eP(zSynopsis[ii]
8950: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
8960: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
8970: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22  zSynopsis+ii+1,"
8980: 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  +1",2)==0 ){.   
8990: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
89a0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
89b0: 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20    v2++;.        
89c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
89d0: 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20    if( v2>1 ){.  
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
89f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8a00: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
8a10: 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31   "..%d", v1+v2-1
8a20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8a30: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8a40: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
8a50: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e  nopsis+ii+1, "..
8a60: 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f  P3", 4)==0 && pO
8a70: 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p3==0 ){.    
8a80: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b          ii += 4;
8a90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8aa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a       }.        j
8ab0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
8ac0: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
8ad0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8ae0: 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d       zTemp[jj++]
8af0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = c;.      }.  
8b00: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
8b10: 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70  nCom && jj<nTemp
8b20: 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  -5 && pOp->zComm
8b30: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
8b40: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8b50: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
8b60: 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a  , "; %s", pOp->z
8b70: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
8b80: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
8b90: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
8ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
8bb0: 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b  j<nTemp ) zTemp[
8bc0: 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  jj] = 0;.  }else
8bd0: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   if( pOp->zComme
8be0: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
8bf0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8c00: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70  , zTemp, "%s", p
8c10: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
8c20: 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53     jj = sqlite3S
8c30: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
8c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65    }else{.    zTe
8c50: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a  mp[0] = 0;.    j
8c60: 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  j = 0;.  }.  ret
8c70: 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66  urn jj;.}.#endif
8c80: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
8c90: 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49   */..#if VDBE_DI
8ca0: 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69  SPLAY_P4 && defi
8cb0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
8cc0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a  E_CURSOR_HINTS).
8cd0: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
8ce0: 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c  the P4.pExpr val
8cf0: 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72  ue for an OP_Cur
8d00: 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69  sorHint opcode i
8d10: 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74  nto text.** that
8d20: 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65   can be displaye
8d30: 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75  d in the P4 colu
8d40: 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75  mn of EXPLAIN ou
8d50: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
8d60: 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45 78  void displayP4Ex
8d70: 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20  pr(StrAccum *p, 
8d80: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
8d90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
8da0: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
8db0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
8dc0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
8dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
8de0: 69 6e 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45  intf(p, "%Q", pE
8df0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
8e00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e10: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
8e20: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
8e30: 50 72 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20  Printf(p, "%d", 
8e40: 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29  pExpr->u.iValue)
8e50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8e60: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
8e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8e80: 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29  rintf(p, "NULL")
8e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8ea0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
8eb0: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
8ec0: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8ed0: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69  r[%d]", pExpr->i
8ee0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
8ef0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8f00: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
8f10: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8f20: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
8f30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
8f40: 72 69 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22  rintf(p, "rowid"
8f50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8f60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
8f70: 50 72 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c  Printf(p, "c%d",
8f80: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f   (int)pExpr->iCo
8f90: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
8fa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8fb0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
8fc0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54  :      zOp = "LT
8fd0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8fe0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
8ff0: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20      zOp = "LE"; 
9000: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9010: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
9020: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20   zOp = "GT";    
9030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9040: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f  e TK_GE:      zO
9050: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62  p = "GE";      b
9060: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9070: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_NE:      zOp =
9080: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61   "NE";      brea
9090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
90a0: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  Q:      zOp = "E
90b0: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  Q";      break;.
90c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
90d0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b       zOp = "IS";
90e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90f0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
9100: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b    zOp = "ISNOT";
9110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9120: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
9130: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20  Op = "AND";     
9140: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9150: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20  TK_OR:      zOp 
9160: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65  = "OR";      bre
9170: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9180: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22  PLUS:    zOp = "
9190: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ADD";     break;
91a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
91b0: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c  R:    zOp = "MUL
91c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
91d0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
91e0: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20     zOp = "SUB"; 
91f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9200: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
9210: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  zOp = "REM";    
9220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9230: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70   TK_BITAND:  zOp
9240: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72   = "BITAND";  br
9250: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9260: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20  _BITOR:   zOp = 
9270: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b  "BITOR";   break
9280: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
9290: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49  ASH:   zOp = "DI
92a0: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  V";     break;. 
92b0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
92c0: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46  T:  zOp = "LSHIF
92d0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
92e0: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
92f0: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b   zOp = "RSHIFT";
9300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9310: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f  e TK_CONCAT:  zO
9320: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62  p = "CONCAT";  b
9330: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9340: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d  K_UMINUS:  zOp =
9350: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61   "MINUS";   brea
9360: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
9370: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50  PLUS:   zOp = "P
9380: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LUS";    break;.
9390: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
93a0: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e  OT:  zOp = "BITN
93b0: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
93c0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
93d0: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20    zOp = "NOT";  
93e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
93f0: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
9400: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20  Op = "ISNULL";  
9410: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9420: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20  TK_NOTNULL: zOp 
9430: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
9440: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
9450: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
9460: 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20  Printf(p, "%s", 
9470: 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62  "expr");.      b
9480: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
9490: 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69   zOp ){.    sqli
94a0: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
94b0: 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64  s(", zOp);.    d
94c0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20  isplayP4Expr(p, 
94d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
94e0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
94f0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
9500: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
9510: 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a  end(p, ",", 1);.
9520: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
9530: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52  xpr(p, pExpr->pR
9540: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
9550: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
9560: 41 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31  Append(p, ")", 1
9570: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9580: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
9590: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
95a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
95b0: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
95c0: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
95d0: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
95e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
95f0: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
9600: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
9610: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
9620: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
9630: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
9640: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
9650: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
9660: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
9670: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
9680: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
9690: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
96a0: 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20    StrAccum x;.  
96b0: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
96c0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  0 );.  sqlite3St
96d0: 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30  rAccumInit(&x, 0
96e0: 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20  , zTemp, nTemp, 
96f0: 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f  0);.  switch( pO
9700: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
9710: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
9720: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  : {.      int j;
9730: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
9740: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
9750: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
9760: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
9770: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
9780: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
9790: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
97a0: 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  k(%d", pKeyInfo-
97b0: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
97c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
97d0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
97e0: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
97f0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
9800: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
9810: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
9820: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
9830: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
9840: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
9850: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
9860: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
9870: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
9880: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9890: 6e 74 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c  ntf(&x, ",%s%s",
98a0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
98b0: 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a  Order[j] ? "-" :
98c0: 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20   "", zColl);.   
98d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
98e0: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
98f0: 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  (&x, ")", 1);.  
9900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9910: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
9920: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
9930: 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45  TS.    case P4_E
9940: 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73  XPR: {.      dis
9950: 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20 70  playP4Expr(&x, p
9960: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20  Op->p4.pExpr);. 
9970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9980: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
9990: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
99a0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
99b0: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
99c0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
99d0: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
99e0: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
99f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
9a00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9a10: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
9a20: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
9a30: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
9a40: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
9a50: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9a60: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
9a70: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
9a80: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
9a90: 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  ;.    }.#if defi
9aa0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
9ab0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
9ac0: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 63  E_PROFILE).    c
9ad0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
9ae0: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
9af0: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
9b00: 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pCtx->pFunc;.   
9b10: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9b20: 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20  f(&x, "%s(%d)", 
9b30: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
9b40: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
9b50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9b60: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
9b70: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
9b80: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9b90: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
9ba0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
9bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9bc0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
9bd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
9be0: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 64 22 2c  Printf(&x, "%d",
9bf0: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
9c00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9c10: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
9c20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9c30: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e  3XPrintf(&x, "%.
9c40: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
9c50: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
9c60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9c70: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
9c80: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
9c90: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
9ca0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
9cb0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
9cc0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
9cd0: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
9ce0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
9cf0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
9d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9d10: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64  Printf(&x, "%lld
9d20: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20  ", pMem->u.i);. 
9d30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
9d40: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9d50: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Real ){.       
9d60: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9d70: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  &x, "%.16g", pMe
9d80: 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m->u.r);.      }
9d90: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
9da0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
9db0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
9dc0: 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d   "NULL";.      }
9dd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9de0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
9df0: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
9e00: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28          zP4 = "(
9e10: 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a  blob)";.      }.
9e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9e30: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9e40: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9e50: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
9e60: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
9e70: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
9e80: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
9e90: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
9ea0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9eb0: 78 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56  x, "vtab:%p", pV
9ec0: 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tab);.      brea
9ed0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
9ee0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
9ef0: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RRAY: {.      in
9f00: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  t i;.      int *
9f10: 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b  ai = pOp->p4.ai;
9f20: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61  .      int n = a
9f30: 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66  i[0];   /* The f
9f40: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
9f50: 61 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61  an INTARRAY is a
9f60: 6c 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20  lways the.      
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
9f90: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
9fa0: 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f  nts to follow */
9fb0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
9fc0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
9fd0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9fe0: 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b  f(&x, ",%d", ai[
9ff0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
a000: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b     zTemp[0] = '[
a010: 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
a020: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
a030: 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20  x, "]", 1);.    
a040: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a050: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
a060: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
a070: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
a080: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
a090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a0a0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56  .    case P4_ADV
a0b0: 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54  ANCE: {.      zT
a0c0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
a0d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a0e0: 20 20 20 63 61 73 65 20 50 34 5f 54 41 42 4c 45     case P4_TABLE
a0f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a100: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73  3XPrintf(&x, "%s
a110: 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d  ", pOp->p4.pTab-
a120: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
a130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a140: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
a150: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
a160: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
a170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
a180: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
a190: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
a1a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a1b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
a1c0: 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a  ccumFinish(&x);.
a1d0: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
a1e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
a1f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44  ;.}.#endif /* VD
a200: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f  BE_DISPLAY_P4 */
a210: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
a220: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
a230: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
a240: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
a250: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
a260: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a270: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
a280: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
a290: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
a2a0: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
a2b0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
a2c0: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
a2d0: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
a2e0: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
a2f0: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
a300: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
a310: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
a320: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
a330: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
a340: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
a350: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
a360: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
a370: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
a380: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
a390: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
a3a0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
a3b0: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
a3c0: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
a3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
a3e0: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
a3f0: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
a400: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72  DbMaskSet(p->btr
a410: 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66  eeMask, i);.  if
a420: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
a430: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
a440: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
a450: 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  ) ){.    DbMaskS
a460: 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20  et(p->lockMask, 
a470: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  i);.  }.}..#if !
a480: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a490: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a4a0: 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  )./*.** If SQLit
a4b0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
a4c0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
a4d0: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
a4e0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
a4f0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
a500: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
a510: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
a520: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
a530: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
a540: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
a550: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
a560: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
a570: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
a580: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
a590: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
a5a0: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
a5b0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
a5c0: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
a5d0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
a5e0: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
a5f0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
a600: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
a610: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
a620: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
a630: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
a640: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
a650: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
a660: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
a670: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
a680: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
a690: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
a6a0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
a6b0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
a6c0: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
a6d0: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
a6e0: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
a6f0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
a700: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
a710: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
a720: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
a730: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
a740: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
a750: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
a760: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
a770: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
a780: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
a790: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
a7a0: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
a7b0: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
a7c0: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
a7d0: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
a7e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
a7f0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
a800: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
a810: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
a820: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
a830: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
a840: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
a850: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
a860: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
a870: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
a880: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
a890: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
a8a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a8b0: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
a8c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
a8d0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
a8e0: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
a8f0: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
a900: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
a910: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
a920: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
a930: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
a940: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
a950: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
a960: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
a970: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
a980: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
a990: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
a9a0: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
a9b0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
a9c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a9d0: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
a9e0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
a9f0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
aa00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
aa10: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
aa20: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
aa30: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
aa40: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
aa50: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
aa60: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
aa70: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
aa80: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73  dbeEnter()..*/.s
aa90: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
aaa0: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c  NLINE void vdbeL
aab0: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
aac0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
aad0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
aae0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64  ;.  int nDb;.  d
aaf0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
ab00: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
ab10: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
ab20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
ab30: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
ab40: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
ab50: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
ab60: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
ab70: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
ab80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
ab90: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  ve(aDb[i].pBt);.
aba0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
abb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
abc0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
abd0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
abe0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
abf0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
ac00: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
ac10: 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a  vdbeLeave(p);.}.
ac20: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
ac30: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
ac40: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
ac50: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
ac60: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
ac70: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
ac80: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
ac90: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
aca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
acb0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
acc0: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
acd0: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
ace0: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
acf0: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
ad00: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
ad10: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
ad20: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
ad30: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
ad40: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
ad50: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
ad60: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
ad70: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
ad80: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
ad90: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
ada0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
adb0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
adc0: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
add0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
ade0: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
adf0: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
ae00: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
ae10: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
ae20: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
ae30: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
ae40: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
ae50: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
ae60: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
ae70: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
ae80: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
ae90: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
aea0: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
aeb0: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
aec0: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
aed0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
aee0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
aef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
af00: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
af10: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
af20: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
af30: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
af40: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
af50: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
af60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
af70: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72  nitialize an arr
af80: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
af90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
afa0: 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  oid initMemArray
afb0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20  (Mem *p, int N, 
afc0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36  sqlite3 *db, u16
afd0: 20 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65   flags){.  while
afe0: 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20  ( (N--)>0 ){.   
aff0: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
b000: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67   p->flags = flag
b010: 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c  s;.    p->szMall
b020: 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  oc = 0;.#ifdef S
b030: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
b040: 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20  p->pScopyFrom = 
b050: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b  0;.#endif.    p+
b060: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
b070: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
b080: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
b090: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
b0a0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
b0b0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
b0c0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
b0d0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
b0e0: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
b0f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
b100: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
b110: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
b120: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
b130: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
b140: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
b150: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
b160: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
b170: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
b180: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
b190: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
b1a0: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
b1b0: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
b1c0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
b1d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b1e0: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
b1f0: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
b200: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
b210: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
b220: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
b230: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
b240: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
b250: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
b260: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
b270: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
b280: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
b290: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
b2a0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
b2b0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
b2c0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
b2d0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
b2e0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
b2f0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
b300: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
b310: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
b320: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
b330: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
b340: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
b350: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
b360: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
b370: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
b380: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
b390: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
b3a0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
b3b0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
b3c0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
b3d0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
b3e0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
b3f0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
b400: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
b410: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
b420: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
b430: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
b440: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
b450: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
b460: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
b470: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
b480: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
b490: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
b4a0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
b4b0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
b4c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
b4d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
b4e0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
b4f0: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
b500: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
b510: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
b520: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b530: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
b540: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
b550: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
b560: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
b570: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
b580: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
b590: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
b5a0: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
b5b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b5c0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
b5d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
b5e0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
b5f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b600: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
b610: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
b620: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
b630: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b640: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
b650: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
b660: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
b670: 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  d );.  }.}../*.*
b680: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
b690: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
b6a0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
b6b0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
b6c0: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
b6d0: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
b6e0: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
b6f0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
b700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
b710: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
b720: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
b730: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
b740: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
b750: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
b760: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
b770: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
b780: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
b790: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b7a0: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
b7b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b7c0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
b7d0: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
b7e0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
b7f0: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
b800: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
b810: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
b820: 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d  ta(p->v->db, &p-
b830: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
b840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
b850: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b  ee(p->v->db, p);
b860: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b870: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
b880: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
b890: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
b8a0: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
b8b0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
b8c0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
b8d0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
b8e0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
b8f0: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
b900: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
b910: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
b920: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
b930: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
b940: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
b950: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
b960: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
b970: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
b980: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
b990: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
b9a0: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
b9b0: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
b9c0: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
b9d0: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
b9e0: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
b9f0: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
ba00: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
ba10: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
ba20: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
ba30: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
ba40: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
ba50: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57  RY PLAN..**.** W
ba60: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
ba70: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69  1, first the mai
ba80: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73  n program is lis
ba90: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f  ted, then each o
baa0: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  f.** the trigger
bab0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
bac0: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f   listed one by o
bad0: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
bae0: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
baf0: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
bb00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
bb10: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
bb20: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f   /* Stop when ro
bb50: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  w count reaches 
bb60: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  this */.  int nS
bb70: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
bba0: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
bbb0: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
bbc0: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
bbe0: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
bbf0: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
bc00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
bc20: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20  emory cell hold 
bc30: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
bc40: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
bc50: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bc70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
bc80: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
bc90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bcc0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bcd0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
bcf0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
bd00: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
bd10: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Mem[1];         
bd20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
bd30: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
bd40: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
bd50: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
bd60: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
bd70: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
bd80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
bd90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
bda0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
bdb0: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
bdc0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
bdd0: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
bde0: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
bdf0: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
be00: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
be10: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
be20: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
be30: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
be40: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
be50: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
be60: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
be70: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
be80: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
be90: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
bea0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
beb0: 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52  Mem, 8);.  p->pR
bec0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20  esultSet = 0;.. 
bed0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
bee0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b  TE_NOMEM_BKPT ){
bef0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
bf00: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
bf10: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
bf20: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
bf30: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
bf40: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
bf50: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
bf60: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ed.  */.    sqli
bf70: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
bf80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bf90: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
bfa0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
bfb0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
bfc0: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
bfd0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
bfe0: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
bff0: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
c000: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
c010: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
c020: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
c030: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
c040: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
c050: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
c060: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
c070: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
c080: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
c090: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
c0a0: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
c0b0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
c0c0: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
c0d0: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
c0e0: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
c0f0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
c100: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
c110: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
c120: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
c130: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
c140: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
c150: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
c160: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
c170: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
c180: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
c190: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
c1a0: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
c1b0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
c1c0: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
c1d0: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
c1e0: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
c1f0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
c200: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
c210: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
c220: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
c230: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
c240: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
c250: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
c260: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
c270: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
c280: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
c290: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
c2a0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
c2b0: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
c2c0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
c2d0: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
c2e0: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
c2f0: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
c300: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
c310: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
c320: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
c330: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
c340: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
c350: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
c360: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
c370: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
c380: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
c390: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
c3a0: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
c3b0: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
c3c0: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
c3d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
c3e0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
c3f0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
c400: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
c410: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
c420: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
c430: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
c440: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
c450: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c460: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
c470: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
c480: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
c490: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
c4a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
c4b0: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
c4c0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
c4d0: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
c4e0: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
c4f0: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
c500: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  se{.    char *zP
c510: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  4;.    Op *pOp;.
c520: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
c530: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
c540: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
c550: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
c560: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
c570: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
c580: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
c590: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
c5a0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
c5b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c5c0: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
c5d0: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
c5e0: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
c5f0: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
c600: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
c610: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
c620: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
c630: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c640: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
c650: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
c660: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
c670: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
c680: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
c690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c6a0: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
c6b0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
c6c0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
c6d0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
c6e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c6f0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
c700: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
c730: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
c740: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
c750: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c760: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
c770: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
c780: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
c790: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
c7a0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
c7b0: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
c7c0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
c7d0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
c7e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
c7f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c800: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
c810: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
c820: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
c830: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
c840: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
c850: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
c860: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
c870: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
c880: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
c890: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
c8a0: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
c8b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
c8c0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
c8d0: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
c8e0: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
c8f0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
c900: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
c910: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
c920: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
c930: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
c940: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
c950: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
c960: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
c970: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
c980: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
c990: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
c9a0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
c9b0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c9c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
c9d0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
c9e0: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
c9f0: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
ca00: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
ca10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ca20: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
ca30: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
ca40: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
ca50: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
ca60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
ca70: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
ca80: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
ca90: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
caa0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
cab0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
cac0: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
cad0: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
cae0: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
caf0: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
cb00: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
cb10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cb20: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
cb30: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
cb40: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
cb50: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
cb80: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
cb90: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
cba0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
cbb0: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
cbe0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
cbf0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
cc00: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
cc10: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
cc40: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
cc50: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
cc60: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
cc70: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
cc80: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
cc90: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
cca0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
ccb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ccc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ccd0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
cce0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ccf0: 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70  ;.    zP4 = disp
cd00: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
cd10: 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  >z, pMem->szMall
cd20: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34  oc);.    if( zP4
cd30: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
cd40: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a     pMem->n = 0;.
cd50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd60: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
cd70: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
cd80: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
cd90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
cda0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
cdb0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
cdc0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cdd0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
cde0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
cdf0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
ce00: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
ce10: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
ce20: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
ce30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
ce40: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
ce50: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
ce60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
ce70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
ce80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ce90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
cea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
ceb0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
cec0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
ced0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
cee0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
cef0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
cf00: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
cf10: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
cf20: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
cf30: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
cf40: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
cf50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cf60: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
cf70: 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73  ENTS.      if( s
cf80: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
cf90: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
cfa0: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
cfb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
cfc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
cfd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cfe0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
cff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
d000: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
d010: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
d020: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
d030: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
d040: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
d050: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
d060: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
d070: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
d080: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
d090: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0b0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
d0c0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
d0d0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
d0e0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
d0f0: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
d100: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
d110: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
d120: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
d130: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
d140: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d150: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d160: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
d170: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
d180: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
d190: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
d1a0: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
d1b0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
d1c0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
d1d0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
d1e0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
d1f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
d200: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
d210: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
d220: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
d230: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
d240: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
d250: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
d260: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
d270: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
d280: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
d290: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
d2a0: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
d2b0: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
d2c0: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
d2d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
d2e0: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
d2f0: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
d300: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
d310: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
d320: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
d330: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
d340: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
d350: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
d360: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
d370: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
d380: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
d390: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
d3a0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
d3b0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
d3c0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
d3d0: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
d3e0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
d3f0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
d400: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
d410: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
d420: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
d430: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
d440: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
d450: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
d460: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
d470: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
d480: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
d490: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
d4a0: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
d4b0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
d4c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
d4d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d4e0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
d4f0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
d500: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
d510: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
d520: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
d530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
d540: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
d550: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
d560: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
d570: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
d580: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
d590: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
d5a0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
d5b0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
d5c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
d5d0: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20  TRACE */../* An 
d5e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
d5f0: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
d600: 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  s bulk memory av
d610: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a  ailable for use.
d620: 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65  ** by subcompone
d630: 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65  nts of a prepare
d640: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70  d statement.  Sp
d650: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
d660: 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75   out.** of a Reu
d670: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
d680: 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70  t by the allocSp
d690: 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65  ace() routine be
d6a0: 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  low..*/.struct R
d6b0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20  eusableSpace {. 
d6c0: 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20   u8 *pSpace;    
d6d0: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
d6e0: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
d6f0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
d700: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
d710: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
d720: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65   */.  int nNeede
d730: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  d;         /* To
d740: 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63  tal bytes that c
d750: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
d760: 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  cated */.};../* 
d770: 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  Try to allocate 
d780: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38  nByte bytes of 8
d790: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75  -byte aligned bu
d7a0: 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42  lk memory for pB
d7b0: 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52  uf.** from the R
d7c0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
d7d0: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
d7e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
d7f0: 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72  located.** memor
d800: 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  y on success.  I
d810: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d  f insufficient m
d820: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
d830: 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75  le in the.** Reu
d840: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
d850: 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  t, increase the 
d860: 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e  ReusableSpace.nN
d870: 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62  eeded.** value b
d880: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65  y the amount nee
d890: 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ded and return N
d8a0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ULL..**.** If pB
d8b0: 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  uf is not initia
d8c0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d  lly NULL, that m
d8d0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65  eans that the me
d8e0: 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  mory has already
d8f0: 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
d900: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
d910: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
d920: 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ne, so just retu
d930: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
d940: 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52  pBuf and leave R
d950: 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63  eusableSpace unc
d960: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  hanged..**.** Th
d970: 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  is allocator is 
d980: 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75  employed to repu
d990: 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f  rpose unused slo
d9a0: 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ts at the end of
d9b0: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61   the.** opcode a
d9c0: 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64  rray of prepared
d9d0: 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72   state for other
d9e0: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66   memory needs of
d9f0: 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a   the prepared.**
da00: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
da10: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
da20: 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74  cSpace(.  struct
da30: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a   ReusableSpace *
da40: 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f  p,  /* Bulk memo
da50: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
da60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
da70: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
da80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
da90: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72  inter to a prior
daa0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
dab0: 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
dac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
dad0: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  tes of memory ne
dae0: 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  eded */.){.  ass
daf0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
db00: 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70  ALIGNMENT(p->pSp
db10: 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42  ace) );.  if( pB
db20: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79  uf==0 ){.    nBy
db30: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
db40: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
db50: 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b  e <= p->nFree ){
db60: 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20  .      p->nFree 
db70: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  -= nByte;.      
db80: 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63  pBuf = &p->pSpac
db90: 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20  e[p->nFree];.   
dba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
dbb0: 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74  >nNeeded += nByt
dbc0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  e;.    }.  }.  a
dbd0: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
dbe0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66  E_ALIGNMENT(pBuf
dbf0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  ) );.  return pB
dc00: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
dc10: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
dc20: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
dc30: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
dc40: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
dc50: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
dc60: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
dc70: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
dc80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
dc90: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
dca0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
dcb0: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
dcc0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
dcd0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
dce0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
dcf0: 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  T || p->magic==V
dd00: 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20  DBE_MAGIC_RESET 
dd10: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
dd20: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
dd30: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
dd40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
dd50: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
dd60: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
dd70: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
dd80: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
dd90: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
dda0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
ddb0: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
ddc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ddd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
dde0: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
ddf0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
de00: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
de10: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
de20: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
de30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
de40: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
de50: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43  E_Abort;.  p->nC
de60: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
de70: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
de80: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
de90: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
dea0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
deb0: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
dec0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
ded0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
dee0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
def0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
df00: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
df10: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
df20: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
df30: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
df40: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
df50: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
df60: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
df70: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
df80: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
df90: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
dfa0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
dfb0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
dfc0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69   allocating regi
dfd0: 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61  sters and initia
dfe0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
dff0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
e000: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
e010: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
e020: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
e030: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
e040: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
e050: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
e060: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e070: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
e080: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ed exactly once 
e090: 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20  on each virtual 
e0a0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
e0b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
e0c0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
e0d0: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
e0e0: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
e0f0: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
e100: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
e110: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68  is called, furth
e120: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
e130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e140: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
e150: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
e160: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
e170: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
e180: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
e190: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
e1a0: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
e1b0: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
e1c0: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
e1d0: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
e1e0: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
e1f0: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
e200: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
e210: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
e220: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
e230: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
e240: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
e250: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
e260: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
e270: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
e280: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
e290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
e2a0: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
e2b0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2d0: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
e2e0: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e300: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e310: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e320: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
e330: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
e340: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e350: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e380: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
e390: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
e3c0: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
e3d0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
e3e0: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
e3f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e400: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
e410: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
e420: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
e430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e440: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e450: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
e460: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e490: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52  er */.  struct R
e4a0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20  eusableSpace x; 
e4b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62         /* Reusab
e4c0: 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a  le bulk memory *
e4d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  /..  assert( p!=
e4e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e4f0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
e500: 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
e510: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
e520: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
e530: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
e540: 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50  t( pParse==p->pP
e550: 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70  arse );.  db = p
e560: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
e570: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e580: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
e590: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
e5a0: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
e5b0: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
e5c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
e5d0: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
e5e0: 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a  nMaxArg;.  .  /*
e5f0: 20 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65   Each cursor use
e600: 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  s a memory cell.
e610: 20 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73    The first curs
e620: 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61  or (cursor 0) ca
e630: 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b  n.  ** use aMem[
e640: 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  0] which is not 
e650: 6f 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62  otherwise used b
e660: 79 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  y the VDBE progr
e670: 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20  am.  Allocate.  
e680: 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ** space at the 
e690: 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f  end of aMem[] fo
e6a0: 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20  r cursors 1 and 
e6b0: 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65  greater..  ** Se
e6c0: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
e6d0: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
e6e0: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
e6f0: 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d  ;.  if( nCursor=
e700: 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e  =0 && nMem>0 ) n
e710: 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65  Mem++;  /* Space
e720: 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65   for aMem[0] eve
e730: 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f  n if not used */
e740: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
e750: 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61  t how much reusa
e760: 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ble memory is av
e770: 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65  ailable at the e
e780: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  nd of the.  ** o
e790: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
e7a0: 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  is extra memory 
e7b0: 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61  will be realloca
e7c0: 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c  ted for other el
e7d0: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ements.  ** of t
e7e0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
e7f0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20  ement..  */.  n 
e800: 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
e810: 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20  Op)*p->nOp);    
e820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e830: 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d  es of opcode mem
e840: 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e  ory used */.  x.
e850: 70 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29  pSpace = &((u8*)
e860: 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20  p->aOp)[n];     
e870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
e880: 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72  sed opcode memor
e890: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  y */.  assert( E
e8a0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
e8b0: 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b  ENT(x.pSpace) );
e8c0: 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55  .  x.nFree = ROU
e8d0: 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e  NDDOWN8(pParse->
e8e0: 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20  szOpAlloc - n); 
e8f0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75   /* Bytes of unu
e900: 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  sed memory */.  
e910: 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e  assert( x.nFree>
e920: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e930: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
e940: 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78  MENT(&x.pSpace[x
e950: 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72  .nFree]) );..  r
e960: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
e970: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
e980: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
e990: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
e9a0: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
e9b0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
e9c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
e9d0: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
e9e0: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
e9f0: 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70  10;.  }.  p->exp
ea00: 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ired = 0;..  /* 
ea10: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73  Memory for regis
ea20: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73  ters, parameters
ea30: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69  , cursor, etc, i
ea40: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f  s allocated in o
ea50: 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70  ne or two.  ** p
ea60: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
ea70: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
ea80: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
ea90: 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  d memory at the 
eaa0: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
eab0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
eac0: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
ead0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
eae0: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
eaf0: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
eb00: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
eb10: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
eb20: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
eb30: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
eb40: 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
eb50: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65  using a fresh me
eb60: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
eb70: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
eb80: 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
eb90: 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
eba0: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
ebb0: 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
ebc0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
ebd0: 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  r memory at the 
ebe0: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
ebf0: 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 63  e array.  This c
ec00: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
ec10: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
ec20: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
ec30: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
ec40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
ec50: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
ec60: 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  x.nNeeded = 0;. 
ec70: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
ec80: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
ec90: 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
eca0: 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61  (Mem));.    p->a
ecb0: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
ecc0: 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56  (&x, p->aVar, nV
ecd0: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  ar*sizeof(Mem));
ece0: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
ecf0: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
ed00: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
ed10: 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20  zeof(Mem*));.   
ed20: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
ed30: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
ed40: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
ed50: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
ed60: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
ed70: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
ed80: 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61  NSTATUS.    p->a
ed90: 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
eda0: 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63  ce(&x, p->anExec
edb0: 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
edc0: 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
edd0: 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d    if( x.nNeeded=
ede0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
edf0: 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46  x.pSpace = p->pF
ee00: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
ee10: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78  allocRawNN(db, x
ee20: 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78  .nNeeded);.    x
ee30: 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64  .nFree = x.nNeed
ee40: 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64  ed;.  }while( !d
ee50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ee60: 29 3b 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20  );..  p->pVList 
ee70: 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  = pParse->pVList
ee80: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  ;.  pParse->pVLi
ee90: 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78  st =  0;.  p->ex
eea0: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
eeb0: 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64  explain;.  if( d
eec0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eed0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
eee0: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73   0;.    p->nCurs
eef0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  or = 0;.    p->n
ef00: 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Mem = 0;.  }else
ef10: 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  {.    p->nCursor
ef20: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
ef30: 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72  p->nVar = (ynVar
ef40: 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d  )nVar;.    initM
ef50: 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
ef60: 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e   nVar, db, MEM_N
ef70: 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65  ull);.    p->nMe
ef80: 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  m = nMem;.    in
ef90: 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  itMemArray(p->aM
efa0: 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45  em, nMem, db, ME
efb0: 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20  M_Undefined);.  
efc0: 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73    memset(p->apCs
efd0: 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69  r, 0, nCursor*si
efe0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
eff0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
f000: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
f010: 41 4e 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d  ANSTATUS.    mem
f020: 73 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30  set(p->anExec, 0
f030: 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
f040: 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
f050: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
f060: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
f070: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
f080: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
f090: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
f0a0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
f0b0: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
f0c0: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
f0d0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
f0e0: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
f0f0: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
f100: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
f110: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f120: 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42   assert( pCx->pB
f130: 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43  tx==0 || pCx->eC
f140: 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
f150: 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63  BTREE );.  switc
f160: 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  h( pCx->eCurType
f170: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52   ){.    case CUR
f180: 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20  TYPE_SORTER: {. 
f190: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f1a0: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
f1b0: 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62  b, pCx);.      b
f1c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f1d0: 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52  case CURTYPE_BTR
f1e0: 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EE: {.      if( 
f1f0: 70 43 78 2d 3e 70 42 74 78 20 29 7b 0a 20 20 20  pCx->pBtx ){.   
f200: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f210: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78  eClose(pCx->pBtx
f220: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
f230: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
f240: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
f250: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
f260: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
f270: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
f280: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20   above. */.     
f290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f2a0: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e  assert( pCx->uc.
f2b0: 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
f2d0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
f2e0: 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  x->uc.pCursor);.
f2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f300: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
f310: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f320: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
f330: 63 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41  case CURTYPE_VTA
f340: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
f350: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
f360: 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e  pVCur = pCx->uc.
f370: 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e  pVCur;.      con
f380: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
f390: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43  e *pModule = pVC
f3a0: 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ur->pVtab->pModu
f3b0: 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  le;.      assert
f3c0: 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  ( pVCur->pVtab->
f3d0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
f3e0: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
f3f0: 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64  ef--;.      pMod
f400: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75  ule->xClose(pVCu
f410: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
f420: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
f440: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20   all cursors in 
f450: 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
f460: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
f470: 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e  d closeCursorsIn
f480: 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a  Frame(Vdbe *p){.
f490: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
f4a0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f4b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f4c0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
f4d0: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a      VdbeCursor *
f4e0: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
f4f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29  ;.      if( pC )
f500: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f510: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
f520: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20  p, pC);.        
f530: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
f540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f550: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79   }.}../*.** Copy
f560: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
f570: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
f580: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
f590: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
f5a0: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
f5b0: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
f5c0: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
f5d0: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
f5e0: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
f5f0: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
f600: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
f610: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
f620: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
f630: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
f640: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
f650: 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  v;.  closeCursor
f660: 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66  sInFrame(v);.#if
f670: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f680: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
f690: 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20  S.  v->anExec = 
f6a0: 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a  pFrame->anExec;.
f6b0: 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20  #endif.  v->aOp 
f6c0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20  = pFrame->aOp;. 
f6d0: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65   v->nOp = pFrame
f6e0: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d  ->nOp;.  v->aMem
f6f0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b   = pFrame->aMem;
f700: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  v->nMem = pFr
f710: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->nMem;.  v->
f720: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e  apCsr = pFrame->
f730: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72  apCsr;.  v->nCur
f740: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  sor = pFrame->nC
f750: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e  ursor;.  v->db->
f760: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61  lastRowid = pFra
f770: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  me->lastRowid;. 
f780: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46   v->nChange = pF
f790: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  rame->nChange;. 
f7a0: 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20   v->db->nChange 
f7b0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61  = pFrame->nDbCha
f7c0: 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  nge;.  sqlite3Vd
f7d0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
f7e0: 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44  v->db, &v->pAuxD
f7f0: 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76  ata, -1, 0);.  v
f800: 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46 72  ->pAuxData = pFr
f810: 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20  ame->pAuxData;. 
f820: 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
f830: 61 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  a = 0;.  return 
f840: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
f850: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
f860: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
f870: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
f880: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
f890: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
f8a0: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
f8b0: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
f8c0: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
f8d0: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
f8e0: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
f8f0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
f900: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
f910: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
f920: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
f930: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
f940: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
f950: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
f960: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
f970: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
f980: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
f990: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
f9a0: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
f9b0: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
f9c0: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
f9d0: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
f9e0: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
f9f0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
fa00: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
fa10: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d  .    p->pFrame =
fa20: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d   0;.    p->nFram
fa30: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
fa40: 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d  ert( p->nFrame==
fa50: 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73  0 );.  closeCurs
fa60: 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20  orsInFrame(p);. 
fa70: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
fa80: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
fa90: 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e  ray(p->aMem, p->
faa0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
fab0: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
fac0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
fad0: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
fae0: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
faf0: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
fb00: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
fb10: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
fb20: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
fb30: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
fb40: 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74   auxdata allocat
fb50: 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65  ions made by the
fb60: 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e   VM */.  if( p->
fb70: 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74  pAuxData ) sqlit
fb80: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
fb90: 61 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70  ata(p->db, &p->p
fba0: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
fbb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41  .  assert( p->pA
fbc0: 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a  uxData==0 );.}..
fbd0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
fbe0: 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69  he VM after a si
fbf0: 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61  ngle run..*/.sta
fc00: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
fc10: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
fc20: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
fc30: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fc40: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63  _DEBUG.  /* Exec
fc50: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ute assert() sta
fc60: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
fc70: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e  e that the Vdbe.
fc80: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a  apCsr[] and .  *
fc90: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72  * Vdbe.aMem[] ar
fca0: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64  rays have alread
fcb0: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75  y been cleaned u
fcc0: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  p.  */.  int i;.
fcd0: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
fce0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
fcf0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
fd00: 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
fd10: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
fd20: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
fd30: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
fd40: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
fd50: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
fd60: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
fd70: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
fd80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
fd90: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
fda0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
fdb0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
fdc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
fdd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
fde0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
fdf0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
fe00: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
fe10: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
fe20: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
fe30: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
fe40: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
fe50: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
fe60: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
fe70: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
fe80: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
fe90: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
fea0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
feb0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
fec0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
fed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
fee0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
fef0: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
ff00: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
ff10: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
ff20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ff30: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
ff40: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
ff50: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
ff60: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
ff70: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
ff80: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
ff90: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
ffa0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
ffb0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
ffc0: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
ffd0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
ffe0: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
fff0: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
10000 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
10010 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
10020 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
10030 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e  0 ) return;.  in
10040 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  itMemArray(p->aC
10050 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 70 2d 3e 64 62  olName, n, p->db
10060 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a  , MEM_Null);.}..
10070 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
10080 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
10090 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
100a0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
100b0 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
100c0 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
100d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
100e0 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
100f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
10100 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
10110 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
10120 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
10130 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
10140 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
10150 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
10160 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
10170 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
10180 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
10190 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
101a0 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
101b0 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
101c0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
101d0 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
101e0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
101f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
10200 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
10210 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
10220 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
10230 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
10240 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10260 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
10270 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
10280 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102a0 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
102b0 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
102c0 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
102f0 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
10300 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
10310 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10330 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
10340 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
10350 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
10360 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
10370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
10380 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
10390 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
103a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
103b0 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
103c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
103d0 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
103e0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
103f0 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
10400 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
10410 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
10420 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
10430 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
10440 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
10450 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
10460 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
10470 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
10480 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
10490 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
104a0 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
104b0 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
104c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
104d0 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
104e0 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
104f0 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
10500 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
10510 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
10520 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
10530 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
10540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10550 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
10560 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
10570 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
10580 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
10590 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
105a0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
105b0 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
105c0 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
105d0 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
105e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
105f0 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
10600 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
10610 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
10620 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
10630 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10640 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
10650 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
10660 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
10670 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
10680 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
10690 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
106a0 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
106b0 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
106c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
106d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
106e0 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
106f0 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61  candidates for a
10700 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
10710 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20  t using a.      
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
10730 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a  master-journal *
10740 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
10750 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
10760 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
10770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
10780 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10790 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
107a0 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
107b0 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
107c0 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
107d0 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
107e0 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
107f0 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
10800 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
10810 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
10820 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
10830 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
10840 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
10850 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
10860 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
10870 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
10880 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
10890 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
108a0 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
108b0 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
108c0 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
108d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
108e0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
108f0 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
10900 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
10910 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
10920 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
10930 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10940 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
10950 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
10960 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
10970 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
10980 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
10990 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
109a0 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
109b0 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
109c0 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
109d0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
109e0 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
109f0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
10a00 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
10a10 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
10a20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
10a30 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
10a40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
10a50 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
10a60 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
10a70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
10a80 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
10a90 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
10aa0 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
10ab0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
10ac0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
10ad0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10ae0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10af0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10b00 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10b10 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
10b20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65   ){.      /* Whe
10b30 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61  ther or not a da
10b40 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65  tabase might nee
10b50 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
10b60 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a  al depends upon.
10b70 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75        ** its jou
10b80 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67  rnal mode (among
10b90 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20   other things). 
10ba0 20 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74   This matrix det
10bb0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20  ermines which.  
10bc0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d      ** journal m
10bd0 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65  odes use a maste
10be0 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68  r journal and wh
10bf0 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20  ich do not */.  
10c00 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
10c10 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20   u8 aMJNeeded[] 
10c20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44  = {.        /* D
10c30 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20  ELETE   */  1,. 
10c40 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53         /* PERSIS
10c50 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  T   */ 1,.      
10c60 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a    /* OFF       *
10c70 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
10c80 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a  TRUNCATE  */ 1,.
10c90 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52          /* MEMOR
10ca0 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20  Y    */ 0,.     
10cb0 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20     /* WAL       
10cc0 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  */ 0.      };.  
10cd0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
10ce0 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73  r;   /* Pager as
10cf0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
10d00 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58  t */.      needX
10d10 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
10d20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10d30 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ter(pBt);.      
10d40 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
10d50 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
10d60 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
10d70 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[i].safety_lev
10d80 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el!=PAGER_SYNCHR
10d90 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20  ONOUS_OFF.      
10da0 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71   && aMJNeeded[sq
10db0 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75  lite3PagerGetJou
10dc0 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29  rnalMode(pPager)
10dd0 5d 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20  ].      ){ .    
10de0 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31      assert( i!=1
10df0 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61   );.        nTra
10e00 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns++;.      }.  
10e10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10e20 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
10e30 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
10e40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10e50 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
10e60 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
10e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10e80 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10e90 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
10ea0 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
10eb0 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
10ec0 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
10ed0 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
10ee0 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
10ef0 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
10f00 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
10f10 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
10f20 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
10f30 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
10f40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10f50 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10f60 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
10f70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
10f80 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
10f90 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
10fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
10fb0 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
10fc0 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
10fd0 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
10fe0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
10ff0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
11000 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
11010 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
11020 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
11030 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
11040 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
11050 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
11060 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
11070 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
11080 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11090 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
110a0 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
110b0 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
110c0 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
110d0 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
110e0 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
110f0 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
11100 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
11110 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
11120 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
11130 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
11140 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
11150 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
11160 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
11170 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
11180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11190 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
111a0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
111b0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
111c0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
111d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
111e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
111f0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
11200 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
11210 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
11220 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
11230 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
11240 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
11250 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
11260 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
11270 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
11280 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
11290 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
112a0 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
112b0 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
112c0 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
112d0 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
112e0 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
112f0 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
11300 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
11310 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
11320 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
11330 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
11340 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
11350 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
11360 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
11370 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
11380 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11390 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
113a0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
113b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
113c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
113d0 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
113e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
113f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11410 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
11420 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
11430 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
11440 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
11450 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
11460 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
11470 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
11480 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
11490 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
114a0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
114b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
114c0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
114d0 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
114e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
114f0 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
11500 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
11510 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
11520 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  s;.    char *zMa
11530 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
11540 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
11550 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11560 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
11570 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
11580 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
11590 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
115a0 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
115b0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
115c0 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
115d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
115e0 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
115f0 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
11600 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
11610 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
11620 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
11630 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
11640 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
11650 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11660 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
11670 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
11680 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
11690 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
116a0 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
116b0 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
116c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
116d0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64  OMEM_BKPT;.    d
116e0 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
116f0 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
11700 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
11710 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
11720 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
11730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
11740 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
11750 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
11760 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11770 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
11780 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
11790 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
117a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
117b0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
117c0 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
117d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
117e0 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
117f0 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
11800 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11810 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11820 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
11830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
11840 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
11850 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
11860 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
11870 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
11880 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
11890 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
118a0 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
118d0 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
118e0 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
118f0 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
11900 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
11910 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
11920 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
11930 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
11940 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
11950 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
11960 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
11970 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
11980 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
11990 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
119a0 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
119b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
119c0 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
119d0 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
119e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
119f0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
11a00 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
11a10 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
11a20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
11a30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
11a40 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
11a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11a60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
11a70 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
11a80 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
11a90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
11aa0 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
11ab0 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
11ac0 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
11ad0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11ae0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
11af0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
11b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
11b10 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
11b20 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
11b30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
11b40 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
11b50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11b60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11b70 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
11b80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11b90 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
11ba0 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
11bb0 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
11bc0 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
11bd0 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
11be0 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
11bf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11c00 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11c10 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
11c20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
11c30 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11c40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11c50 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
11c60 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
11c70 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
11c80 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
11c90 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11ca0 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
11cb0 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
11cc0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
11cd0 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
11ce0 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
11cf0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
11d00 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
11d10 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11d20 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11d30 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
11d40 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
11d50 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
11d60 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
11d70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
11d80 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
11d90 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
11da0 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
11db0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
11dc0 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
11dd0 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
11de0 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
11df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11e00 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
11e10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
11e20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11e30 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
11e40 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
11e50 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
11e60 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
11e70 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
11e80 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
11e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11eb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11ec0 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
11ed0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
11ee0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11ef0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
11f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11f10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11f20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
11f30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11f50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
11f60 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
11f70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
11f80 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
11f90 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
11fa0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
11fb0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
11fc0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
11fd0 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  f( 0==(sqlite3Os
11fe0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
11ff0 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
12000 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
12010 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
12020 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
12030 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
12040 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
12050 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
12060 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12070 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
12080 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
12090 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
120a0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
120b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
120c0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
120d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
120e0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
120f0 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
12100 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
12110 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
12120 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
12130 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
12140 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12150 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
12160 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
12170 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
12180 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
12190 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
121a0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
121b0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
121c0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
121d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
121e0 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
121f0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
12200 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12210 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
12220 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
12230 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
12240 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
12250 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
12260 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
12270 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
12280 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
12290 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
122a0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
122b0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
122c0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
122d0 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
122e0 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
122f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
12300 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
12310 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
12320 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
12330 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12340 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12350 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
12360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12370 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12380 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
12390 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
123a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
123b0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
123c0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
123d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
123e0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
123f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12400 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12410 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
12420 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12430 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
12440 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
12450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
12460 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
12470 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
12480 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
12490 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
124a0 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
124b0 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
124c0 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
124d0 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
124e0 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
124f0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
12500 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
12510 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
12520 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
12530 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
12540 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
12550 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
12560 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12570 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
12580 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
12590 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
125a0 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
125b0 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
125c0 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
125d0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
125e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
125f0 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
12600 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
12610 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
12620 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
12630 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
12640 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
12650 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
12660 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
12670 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
12680 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
12690 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
126a0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
126b0 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
126c0 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
126d0 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
126e0 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
126f0 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
12700 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
12710 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
12720 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
12730 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
12740 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
12750 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
12760 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
12770 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12780 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
12790 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
127a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
127b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
127c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
127d0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
127e0 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
127f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12800 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
12810 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12820 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
12830 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
12840 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
12850 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
12860 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
12870 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
12880 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
12890 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
128a0 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
128b0 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
128c0 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
128d0 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
128e0 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
128f0 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
12900 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
12910 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
12920 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
12930 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
12940 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
12950 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
12960 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
12970 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
12980 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
12990 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
129a0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
129b0 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
129c0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
129d0 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
129e0 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
129f0 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
12a00 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
12a10 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
12a20 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
12a30 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
12a40 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
12a50 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
12a60 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
12a70 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
12a80 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
12a90 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
12aa0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
12ab0 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
12ac0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
12ad0 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
12ae0 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
12af0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
12b00 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
12b10 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
12b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
12b30 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
12b40 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
12b50 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
12b60 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
12b70 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
12b80 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
12b90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
12ba0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
12bb0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
12bc0 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
12bd0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
12be0 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
12bf0 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
12c00 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
12c10 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
12c20 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
12c30 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
12c40 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
12c50 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
12c60 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
12c70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
12c80 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
12c90 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
12ca0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
12cb0 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
12cc0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
12cd0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
12ce0 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
12cf0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
12d00 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
12d10 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
12d20 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
12d30 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
12d40 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
12d50 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62  NOINLINE int vdb
12d60 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
12d70 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
12d80 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
12d90 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
12da0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12db0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
12dc0 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
12dd0 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
12de0 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65  ement-1;..  asse
12df0 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
12e00 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
12e10 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
12e20 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
12e30 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
12e40 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
12e50 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
12e60 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
12e70 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
12e80 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
12e90 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
12ea0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
12eb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72  LITE_OK;.    Btr
12ec0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12ed0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
12ee0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69  ( pBt ){.      i
12ef0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12f00 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
12f10 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
12f20 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
12f30 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
12f40 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
12f50 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
12f60 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
12f70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f80 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
12f90 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
12fa0 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
12fb0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
12fc0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
12fd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12ff0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
13000 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  }.    }.  }.  db
13010 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
13020 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
13030 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  = 0;..  if( rc==
13040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13050 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
13060 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
13070 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13080 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
13090 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
130a0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
130b0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
130c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
130d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
130e0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
130f0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
13100 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
13110 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
13120 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  }..  /* If the s
13130 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13140 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
13150 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
13160 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a  restore the .  *
13170 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
13180 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
13190 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
131a0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
131b0 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68  ad when .  ** th
131c0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
131d0 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
131e0 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f  ed.  */.  if( eO
131f0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
13200 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d  LBACK ){.    db-
13210 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
13220 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
13230 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  ;.    db->nDefer
13240 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
13250 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
13260 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13270 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
13280 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
13290 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
132a0 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  Op){.  if( p->db
132b0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
132c0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
132d0 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65  .    return vdbe
132e0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
132f0 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  , eOp);.  }.  re
13300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13310 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
13320 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13330 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
13340 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
13350 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
13360 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
13370 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
13380 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
13390 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
133a0 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
133b0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
133c0 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
133d0 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
133e0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
133f0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
13400 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
13410 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
13420 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
13430 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
13440 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
13450 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
13460 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
13470 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
13480 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
13490 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
134a0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
134b0 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
134c0 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
134d0 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
134e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
134f0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
13500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
13510 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
13520 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
13530 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
13540 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
13550 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
13560 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
13570 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
13580 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
13590 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
135a0 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
135b0 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
135c0 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
135d0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
135e0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
135f0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
13600 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
13610 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
13620 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
13630 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
13640 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
13650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13660 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
13670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13680 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13690 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
136a0 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
136b0 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
136c0 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
136d0 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
136e0 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
136f0 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
13700 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
13710 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
13720 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
13730 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
13740 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
13750 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13760 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
13770 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
13780 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
13790 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
137a0 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
137b0 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
137c0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
137d0 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
137e0 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
137f0 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
13800 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
13810 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
13820 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
13830 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
13840 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
13850 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
13860 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
13870 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
13880 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
13890 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
138a0 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
138b0 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
138c0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
138d0 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
138e0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
138f0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13900 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13920 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
13930 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
13940 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
13950 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
13960 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
13970 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
13980 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
13990 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
139a0 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
139b0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
139c0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
139d0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
139e0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
139f0 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
13a00 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
13a10 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
13a20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
13a30 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
13a40 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
13a50 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
13a60 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
13a70 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
13a80 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
13a90 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
13aa0 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
13ab0 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
13ac0 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
13ad0 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
13ae0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
13af0 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
13b00 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
13b10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
13b20 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
13b30 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
13b40 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
13b50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
13b60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
13b70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13b80 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
13b90 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
13ba0 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
13bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
13bd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13be0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
13bf0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
13c00 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
13c10 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b  sors(p);.  check
13c20 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
13c30 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
13c40 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
13c50 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
13c60 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
13c70 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
13c80 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
13c90 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
13ca0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
13cb0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
13cc0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
13cd0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
13ce0 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
13cf0 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
13d00 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
13d10 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
13d20 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
13d30 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
13d40 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
13d50 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
13d60 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
13d70 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
13d80 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
13d90 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
13da0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
13db0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
13dc0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
13dd0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
13de0 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
13df0 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
13e00 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
13e10 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
13e20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
13e30 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
13e40 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
13e50 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
13e60 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
13e70 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
13e80 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
13e90 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
13ea0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
13eb0 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
13ec0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
13ed0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
13ee0 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
13ef0 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
13f00 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
13f10 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
13f20 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
13f30 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
13f40 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
13f50 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
13f60 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
13f70 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
13f80 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
13f90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
13fa0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
13fb0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
13fc0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
13fd0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
13fe0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
13ff0 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
14000 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
14010 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
14020 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
14030 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
14040 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
14050 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
14060 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
14070 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
14080 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
14090 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
140a0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
140b0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
140c0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
140d0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
140e0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
140f0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
14100 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
14110 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
14120 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
14130 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
14140 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
14150 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
14160 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
14170 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
14180 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
14190 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
141a0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
141b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
141c0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
141d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
141e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
141f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
14200 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
14210 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
14220 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
14230 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
14240 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
14250 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
14260 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
14270 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
14280 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
14290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
142a0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
142b0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
142c0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
142d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
142e0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
142f0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
14300 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14310 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
14320 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14340 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
14350 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
14360 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
14370 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
14380 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
143a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
143b0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
143c0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
143d0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
143e0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
143f0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
14400 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
14410 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
14420 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
14430 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
14440 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
14450 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
14460 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
14470 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
14480 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
14490 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
144a0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
144b0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
144c0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
144d0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
144e0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
144f0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
14500 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
14510 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
14520 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
14530 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
14540 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14550 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
14560 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
14570 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
14580 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
14590 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
145a0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
145b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
145c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
145d0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
145e0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
145f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14600 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14610 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
14620 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14630 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14650 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
14660 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
14670 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
14680 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
14690 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
146a0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
146b0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
146c0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
146d0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
146e0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
146f0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
14700 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
14710 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
14720 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
14730 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
14740 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
14750 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
14760 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
14770 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
14780 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
14790 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
147a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
147b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
147c0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
147d0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
147e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
147f0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
14800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
14810 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
14820 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
14830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14840 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
14850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14860 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14870 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
14880 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14890 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
148a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
148b0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
148c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
148d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
148e0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
148f0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
14900 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
14910 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14920 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
14930 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
14940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
14960 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
14970 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
14980 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
14990 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
149a0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
149b0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
149c0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
149d0 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
149e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
149f0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
14a00 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
14a10 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
14a20 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
14a30 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
14a40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
14a50 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
14a60 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
14a70 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
14a80 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
14a90 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
14aa0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14ab0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14ac0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
14ad0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
14ae0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
14af0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14b00 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14b10 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
14b20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14b40 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
14b50 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
14b60 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
14b70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14b80 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
14b90 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
14ba0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
14bb0 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
14bc0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
14bd0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
14be0 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
14bf0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
14c00 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
14c10 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
14c20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
14c30 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
14c40 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
14c50 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
14c60 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
14c70 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
14c80 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
14c90 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
14ca0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
14cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
14cc0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
14cd0 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
14ce0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
14cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14d10 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
14d20 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14d40 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
14d50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14d60 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
14d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
14d80 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
14d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
14da0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
14db0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
14dc0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
14dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
14de0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
14df0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
14e00 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
14e10 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14e20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14e30 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
14e40 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
14e50 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
14e60 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
14e70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14e80 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
14e90 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
14ea0 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
14eb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
14ec0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
14ed0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14ee0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
14ef0 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
14f00 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
14f10 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
14f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14f30 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
14f40 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
14f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
14f70 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
14f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14f90 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14fa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
14fb0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
14fc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
14fd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a  eLeave(p);.  }..
14fe0 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
14ff0 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
15000 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
15010 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
15020 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
15030 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
15040 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d  db->nVdbeActive-
15050 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
15060 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56  eadOnly ) db->nV
15070 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20  dbeWrite--;.    
15080 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
15090 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64   ) db->nVdbeRead
150a0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
150b0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
150c0 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
150d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
150e0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d  ->nVdbeRead>=db-
150f0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
15100 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
15110 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a  VdbeWrite>=0 );.
15120 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
15130 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
15140 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
15150 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
15160 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
15170 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
15180 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
15190 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
151a0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
151b0 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
151c0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
151d0 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
151e0 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
151f0 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
15200 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
15210 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
15220 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
15230 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
15240 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
15250 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
15260 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
15270 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
15280 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
15290 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
152a0 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
152b0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
152c0 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62  beActive>0 || db
152d0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
152e0 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  || db->nStatemen
152f0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
15300 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
15310 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55  BUSY ? SQLITE_BU
15320 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  SY : SQLITE_OK);
15330 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
15340 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
15350 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
15360 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
15370 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
15380 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
15390 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
153a0 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
153b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
153c0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
153d0 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
153e0 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
153f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
15400 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
15410 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
15420 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c  rror message bel
15430 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44  onging to the VD
15440 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  BE passed.** as 
15450 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
15460 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61  nt to its databa
15470 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68  se handle (so th
15480 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
15490 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
154a0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
154b0 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
154c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29  qlite3_errmsg())
154d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
154e0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
154f0 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72  lear the VDBE er
15500 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73  ror code or mess
15510 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70  age, just.** cop
15520 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ies them to the 
15530 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
15540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15550 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
15560 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
15570 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
15580 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
15590 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72  rc;.  if( p->zEr
155a0 72 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e  rMsg ){.    db->
155b0 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b  bBenignMalloc++;
155c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
155d0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
155e0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72  .    if( db->pEr
155f0 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20  r==0 ) db->pErr 
15600 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
15610 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
15620 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
15630 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
15640 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
15650 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
15660 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
15670 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15680 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42  oc();.    db->bB
15690 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20  enignMalloc--;. 
156a0 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
156b0 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
156c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
156d0 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
156e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
156f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15700 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
15710 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
15720 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
15730 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
15740 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
15750 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
15760 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
15770 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
15780 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
15790 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
157a0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
157b0 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
157c0 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
157d0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
157e0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
157f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
15800 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
15810 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
15820 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
15830 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
15840 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
15850 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
15860 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
15870 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15880 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
15890 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
158a0 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
158b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
158c0 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
158d0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
158e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
158f0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
15900 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
15910 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
15920 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
15930 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
15940 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
15950 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
15960 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
15970 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
15980 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
15990 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
159a0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
159b0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
159c0 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
159d0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
159e0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
159f0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
15a00 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
15a10 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
15a20 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
15a30 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
15a40 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
15a50 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
15a60 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
15a70 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
15a80 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
15a90 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
15aa0 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
15ab0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
15ac0 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
15ad0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
15ae0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
15af0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
15b00 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
15b10 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
15b20 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
15b30 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
15b40 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
15b50 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
15b60 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
15b70 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
15b80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
15b90 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
15ba0 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
15bb0 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
15bc0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
15bd0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
15be0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
15bf0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
15c00 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
15c10 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
15c20 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
15c30 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
15c40 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
15c50 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
15c60 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
15c70 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
15c80 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15c90 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
15ca0 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
15cb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
15cc0 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
15cd0 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
15ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
15cf0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
15d00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15d10 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
15d20 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
15d30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
15d40 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
15d50 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
15d60 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
15d70 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
15d80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
15d90 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
15da0 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
15db0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
15dc0 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
15dd0 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
15de0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
15df0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
15e00 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
15e10 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
15e20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
15e30 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
15e40 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15e50 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
15e60 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
15e70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
15e80 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
15e90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
15ea0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
15eb0 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
15ec0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
15ed0 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
15ee0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
15ef0 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
15f00 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
15f10 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
15f20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
15f30 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
15f40 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
15f50 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
15f60 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
15f70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
15f80 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
15f90 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
15fa0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
15fb0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
15fc0 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
15fd0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
15fe0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
15ff0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
16000 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
16010 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
16020 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
16030 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
16040 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
16050 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
16060 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
16070 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
16080 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
16090 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
160a0 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
160b0 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
160c0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
160d0 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
160e0 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
160f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
16100 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
16110 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
16120 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
16130 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
16140 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
16150 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
16160 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
16170 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
16180 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
16190 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
161a0 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
161b0 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
161c0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
161d0 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
161e0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
161f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
16200 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
16210 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
16220 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
16230 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
16240 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
16250 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
16260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16270 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
16280 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
16290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
162a0 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
162b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
162c0 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
162d0 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
162e0 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b  DBE_MAGIC_RESET;
162f0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
16300 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
16310 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
16320 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
16330 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
16340 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
16350 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
16360 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
16370 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
16380 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
16390 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
163a0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
163b0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
163c0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
163d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
163e0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
163f0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
16400 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
16410 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
16420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
16430 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
16440 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
16450 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
16460 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
16470 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
16480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16490 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
164a0 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
164b0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
164c0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
164d0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
164e0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
164f0 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
16500 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
16510 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
16520 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16530 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
16540 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
16550 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
16560 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
16570 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
16580 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
16590 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
165a0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
165b0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
165c0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
165d0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
165e0 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
165f0 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
16600 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
16610 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
16620 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
16630 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
16640 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
16650 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
16660 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
16670 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
16680 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
16690 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
166a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
166b0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
166c0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
166d0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
166e0 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
166f0 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
16700 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
16710 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
16720 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16730 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33  eAuxData(sqlite3
16740 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a   *db, AuxData **
16750 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  pp, int iOp, int
16760 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28   mask){.  while(
16770 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
16780 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
16790 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
167a0 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
167b0 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75  iOp==iOp && (pAu
167c0 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28  x->iArg>31 || !(
167d0 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32  mask & MASKBIT32
167e0 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a  (pAux->iArg)))).
167f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
16800 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72  tcase( pAux->iAr
16810 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69  g==31 );.      i
16820 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
16830 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
16840 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
16850 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
16860 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
16870 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
16880 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16890 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
168a0 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
168b0 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
168c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
168d0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
168e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
168f0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
16900 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
16910 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
16920 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
16930 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
16940 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
16950 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
16960 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16970 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
16980 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
16990 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
169a0 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
169b0 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
169c0 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
169d0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
169e0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
169f0 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
16a00 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
16a10 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
16a20 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
16a30 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
16a40 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
16a50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
16a60 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
16a70 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
16a80 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
16a90 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
16aa0 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
16ab0 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
16ac0 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
16ad0 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
16ae0 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
16af0 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
16b00 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
16b10 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
16b20 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
16b30 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
16b40 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
16b50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d  ;.  }.  if( p->m
16b60 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
16b70 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c  _INIT ){.    rel
16b80 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
16b90 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
16ba0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16bb0 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29  e(db, p->pVList)
16bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
16bd0 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
16be0 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65  );.  }.  vdbeFre
16bf0 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
16c00 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
16c10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16c20 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
16c30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16c40 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69  db, p->zSql);.#i
16c50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16c60 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
16c70 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  US.  {.    int i
16c80 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16c90 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b  <p->nScan; i++){
16ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
16cb0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
16cc0 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  n[i].zName);.   
16cd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
16ce0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
16cf0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  n);.  }.#endif.}
16d00 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
16d10 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
16d20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16d30 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
16d40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16d50 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
16d60 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
16d70 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
16d80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16d90 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
16da0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16db0 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
16dc0 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  (db, p);.  if( p
16dd0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
16de0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
16df0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
16e00 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
16e10 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
16e20 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
16e30 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
16e40 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
16e50 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
16e60 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
16e70 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
16e80 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
16e90 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
16ea0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16eb0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
16ec0 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
16ed0 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
16ee0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
16ef0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
16f00 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
16f10 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
16f20 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
16f30 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
16f40 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
16f50 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
16f60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16f70 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
16f80 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
16f90 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
16fa0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
16fb0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
16fc0 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
16fd0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
16fe0 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
16ff0 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
17000 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
17010 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
17020 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
17030 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
17040 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
17050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17060 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
17070 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
17080 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
17090 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
170a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
170b0 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
170c0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
170d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
170e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
170f0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
17100 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
17110 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
17120 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
17130 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
17140 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
17150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
17170 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
17180 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
17190 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
171a0 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
171b0 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
171c0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
171d0 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
171e0 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
171f0 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
17200 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
17210 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
17220 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
17230 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
17240 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
17250 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
17260 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
17270 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
17280 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
17290 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
172a0 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
172b0 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
172c0 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
172d0 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
172e0 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
172f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
17300 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
17310 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
17320 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17330 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
17340 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  ( p->uc.pCursor!
17350 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17360 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17370 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
17380 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72  .pCursor) );.  r
17390 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
173a0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d  CursorRestore(p-
173b0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73  >uc.pCursor, &is
173c0 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20  DifferentRow);. 
173d0 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
173e0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
173f0 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74   if( isDifferent
17400 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77  Row ) p->nullRow
17410 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
17420 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
17430 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  k to ensure that
17440 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
17450 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74  alid.  Restore t
17460 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20  he cursor.** if 
17470 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e  need be.  Return
17480 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66   any I/O error f
17490 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20  rom the restore 
174a0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  operation..*/.in
174b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
174c0 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43  sorRestore(VdbeC
174d0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
174e0 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
174f0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
17500 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17510 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
17520 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
17530 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
17540 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
17550 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
17560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17570 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
17580 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
17590 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
175a0 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
175b0 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
175c0 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
175d0 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
175e0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
175f0 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
17600 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
17610 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
17620 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
17630 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
17640 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
17650 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
17660 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
17670 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
17680 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
17690 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
176a0 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
176b0 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
176c0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
176d0 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
176e0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
176f0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
17700 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
17710 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
17720 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
17730 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
17740 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
17750 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
17760 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
17770 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
17780 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
17790 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
177a0 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
177b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
177c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
177d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
177e0 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
177f0 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69  or **pp, int *pi
17800 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73  Col){.  VdbeCurs
17810 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69  or *p = *pp;.  i
17820 66 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  f( p->eCurType==
17830 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b  CURTYPE_BTREE ){
17840 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65  .    if( p->defe
17850 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
17860 20 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20      int iMap;.  
17870 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d      if( p->aAltM
17880 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d  ap && (iMap = p-
17890 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f  >aAltMap[1+*piCo
178a0 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  l])>0 ){.       
178b0 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75   *pp = p->pAltCu
178c0 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a 70  rsor;.        *p
178d0 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b  iCol = iMap - 1;
178e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
178f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
17900 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
17910 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
17920 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20  veto(p);.    }. 
17930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
17940 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
17950 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
17960 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17970 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
17980 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  or(p);.    }.  }
17990 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
179a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
179b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
179c0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
179d0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
179e0 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
179f0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
17a00 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
17a10 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
17a20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17a30 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
17a40 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
17a50 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
17a60 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
17a70 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
17a80 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
17a90 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
17aa0 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
17ab0 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
17ac0 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
17ad0 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
17ae0 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
17af0 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
17b00 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
17b10 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
17b20 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
17b30 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
17b40 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
17b50 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
17b60 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
17b70 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
17b80 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
17b90 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
17ba0 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
17bb0 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
17bc0 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
17bd0 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
17be0 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
17bf0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17c00 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
17c10 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
17c20 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
17c30 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
17c40 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
17c50 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
17c60 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
17c70 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
17c80 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
17c90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
17ca0 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
17cb0 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
17cc0 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
17cd0 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
17ce0 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
17cf0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
17d00 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
17d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
17d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17d30 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17d40 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
17d70 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
17da0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17db0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
17dc0 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
17dd0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17de0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
17e10 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
17e20 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
17e40 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17e50 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17e60 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
17e70 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
17e80 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17e90 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17ec0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17ed0 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
17ef0 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
17f00 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
17f30 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
17f40 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
17f70 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
17f80 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
17fb0 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
17fc0 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
17fd0 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
17fe0 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
17ff0 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
18000 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
18010 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
18020 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
18030 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
18040 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
18050 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
18060 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
18070 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
18080 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
18090 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
180a0 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
180b0 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
180c0 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
180d0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
180e0 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
180f0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
18100 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
18110 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20  ile_format, u32 
18120 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c  *pLen){.  int fl
18130 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
18140 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61  s;.  u32 n;..  a
18150 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29  ssert( pLen!=0 )
18160 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ;.  if( flags&ME
18170 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Null ){.    *p
18180 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Len = 0;.    ret
18190 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
181a0 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
181b0 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
181c0 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
181d0 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
181e0 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
181f0 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
18200 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
18210 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
18220 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
18230 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
18240 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
18250 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
18260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
18270 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
18280 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
18290 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20     if( (i&1)==i 
182a0 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
182b0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  4 ){.        *pL
182c0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
182d0 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b  return 8+(u32)u;
182e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
182f0 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b        *pLen = 1;
18300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18310 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
18320 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
18330 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20  7 ){ *pLen = 2; 
18340 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20  return 2; }.    
18350 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
18360 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74  { *pLen = 3; ret
18370 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28  urn 3; }.    if(
18380 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
18390 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74  { *pLen = 4; ret
183a0 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28  urn 4; }.    if(
183b0 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b   u<=MAX_6BYTE ){
183c0 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75   *pLen = 6; retu
183d0 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65  rn 5; }.    *pLe
183e0 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
183f0 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
18400 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
18410 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
18420 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
18430 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
18440 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
18450 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
18460 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
18470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
18480 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
18490 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
184a0 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
184b0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
184c0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
184d0 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b    }.  *pLen = n;
184e0 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
184f0 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
18500 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
18510 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
18520 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70  s for serial typ
18530 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  es less than 128
18540 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
18550 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   u8 sqlite3Small
18560 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a  TypeSizes[] = {.
18570 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20          /*  0   
18580 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20  1   2   3   4   
18590 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20  5   6   7   8   
185a0 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a  9 */   ./*   0 *
185b0 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20  /   0,  1,  2,  
185c0 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20  3,  4,  6,  8,  
185d0 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31  8,  0,  0,./*  1
185e0 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  0 */   0,  0,  0
185f0 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32  ,  0,  1,  1,  2
18600 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a  ,  2,  3,  3,./*
18610 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c    20 */   4,  4,
18620 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c    5,  5,  6,  6,
18630 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c    7,  7,  8,  8,
18640 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20  ./*  30 */   9, 
18650 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20   9, 10, 10, 11, 
18660 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20  11, 12, 12, 13, 
18670 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31  13,./*  40 */  1
18680 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31  4, 14, 15, 15, 1
18690 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31  6, 16, 17, 17, 1
186a0 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f  8, 18,./*  50 */
186b0 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30    19, 19, 20, 20
186c0 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32  , 21, 21, 22, 22
186d0 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30  , 23, 23,./*  60
186e0 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c   */  24, 24, 25,
186f0 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c   25, 26, 26, 27,
18700 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20   27, 28, 28,./* 
18710 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20   70 */  29, 29, 
18720 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20  30, 30, 31, 31, 
18730 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a  32, 32, 33, 33,.
18740 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33  /*  80 */  34, 3
18750 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33  4, 35, 35, 36, 3
18760 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33  6, 37, 37, 38, 3
18770 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39  8,./*  90 */  39
18780 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31  , 39, 40, 40, 41
18790 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33  , 41, 42, 42, 43
187a0 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20  , 43,./* 100 */ 
187b0 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c   44, 44, 45, 45,
187c0 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c   46, 46, 47, 47,
187d0 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20   48, 48,./* 110 
187e0 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20  */  49, 49, 50, 
187f0 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20  50, 51, 51, 52, 
18800 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31  52, 53, 53,./* 1
18810 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35  20 */  54, 54, 5
18820 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35  5, 55, 56, 56, 5
18830 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  7, 57.};../*.** 
18840 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
18850 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
18860 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
18870 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
18880 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
18890 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
188a0 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
188b0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
188c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
188d0 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  8 ){.    return 
188e0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
188f0 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
18900 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
18910 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20  type<12 .       
18920 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
18930 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
18940 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72  rial_type]==(ser
18950 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32  ial_type - 12)/2
18960 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   );.    return s
18970 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18980 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18990 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69  ];.  }.}.u8 sqli
189a0 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
189b0 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73  rialTypeLen(u8 s
189c0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61  erial_type){.  a
189d0 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
189e0 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75  pe<128 );.  retu
189f0 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
18a00 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
18a10 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  type];  .}../*.*
18a20 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
18a30 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
18a40 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
18a50 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
18a60 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
18a70 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
18a80 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
18a90 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
18aa0 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
18ab0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
18ac0 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
18ad0 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
18ae0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
18af0 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
18b00 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
18b10 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
18b20 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
18b30 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
18b40 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
18b50 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
18b60 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
18b70 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
18b80 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
18b90 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
18ba0 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
18bb0 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
18bc0 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
18bd0 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
18be0 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
18bf0 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
18c00 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
18c10 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
18c20 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
18c30 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
18c40 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
18c50 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
18c60 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
18c70 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
18c80 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
18c90 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
18ca0 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
18cb0 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
18cc0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
18cd0 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
18ce0 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
18cf0 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
18d00 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
18d10 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
18d20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
18d30 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
18d40 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
18d50 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
18d60 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
18d70 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
18d80 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
18d90 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
18da0 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
18db0 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
18dc0 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
18dd0 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
18de0 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
18df0 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
18e00 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
18e10 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
18e20 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
18e30 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
18e40 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
18e50 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
18e60 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
18e70 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
18e80 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
18e90 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
18ea0 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
18eb0 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
18ec0 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
18ed0 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
18ee0 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
18ef0 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
18f00 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
18f10 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
18f20 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
18f30 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
18f40 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
18f50 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
18f60 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
18f70 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
18f80 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
18f90 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
18fa0 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
18fb0 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
18fc0 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
18fd0 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
18fe0 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
18ff0 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
19000 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
19010 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
19020 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
19030 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
19040 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
19050 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
19060 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
19070 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
19080 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
19090 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
190a0 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
190b0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
190c0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
190d0 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
190e0 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
190f0 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
19100 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
19110 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
19120 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
19130 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
19140 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
19150 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
19160 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
19170 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
19180 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
19190 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
191a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
191b0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
191c0 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
191d0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
191e0 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
191f0 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
19200 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
19210 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
19220 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
19230 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
19240 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
19250 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
19260 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
19270 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
19280 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
19290 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
192a0 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
192b0 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  ].  The caller i
192c0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a  s responsible.**
192d0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20   for allocating 
192e0 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
192f0 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68  buf[] to hold th
19300 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20  e entire field, 
19310 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20  exclusive.** of 
19320 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  the pMem->u.nZer
19330 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45  o bytes for a ME
19340 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  M_Zero value..**
19350 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19360 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
19370 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
19380 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
19390 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
193a0 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
193b0 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
193c0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
193d0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
193e0 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
193f0 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
19400 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
19410 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19420 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d  alPut(u8 *buf, M
19430 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65  em *pMem, u32 se
19440 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33  rial_type){.  u3
19450 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
19460 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
19470 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
19480 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
19490 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
194a0 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
194b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
194c0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
194d0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
194e0 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
194f0 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  u.r) );.      me
19500 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
19510 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  u.r, sizeof(v));
19520 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
19530 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
19540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19550 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
19560 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
19570 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  i = sqlite3Small
19580 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
19590 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65  _type];.    asse
195a0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64  rt( i>0 );.    d
195b0 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69  o{.      buf[--i
195c0 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
195d0 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
195e0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29  .    }while( i )
195f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
19600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
19610 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
19620 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
19630 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
19640 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
19650 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
19660 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
19670 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
19680 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
19690 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
196a0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
196b0 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
196c0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28  pMem->n;.    if(
196d0 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28   len>0 ) memcpy(
196e0 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
196f0 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
19700 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
19710 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
19720 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
19730 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
19740 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
19750 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
19760 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
19770 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
19780 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19790 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
197a0 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
197b0 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
197c0 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
197d0 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
197e0 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
197f0 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
19800 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
19810 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
19820 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
19830 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
19840 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
19850 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
19860 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
19870 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
19880 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
19890 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
198a0 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
198b0 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
198c0 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
198d0 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
198e0 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
198f0 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
19900 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
19910 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
19920 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
19930 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
19940 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
19950 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
19960 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
19970 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19980 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
19990 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
199a0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
199b0 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
199c0 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
199d0 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
199e0 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
199f0 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
19a00 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
19a10 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
19a20 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
19a30 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
19a40 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
19a50 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
19a60 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
19a70 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
19a80 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
19a90 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
19aa0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
19ab0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19ac0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
19ad0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
19ae0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
19af0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
19b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
19b10 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
19b20 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
19b30 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
19b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
19b50 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
19b60 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
19b70 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
19b80 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
19b90 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
19ba0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
19bb0 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
19bc0 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
19bd0 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
19be0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19bf0 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37  OF: R-29851-5227
19c00 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  2 Value is a big
19c10 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20  -endian 64-bit. 
19c20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
19c30 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
19c40 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  /.    pMem->u.i 
19c50 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
19c60 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19c70 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
19c80 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
19c90 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
19ca0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19cb0 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20  : R-57343-49114 
19cc0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
19cd0 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32  ndian IEEE 754-2
19ce0 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  008 64-bit.    *
19cf0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
19d00 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20   number. */.#if 
19d10 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
19d20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
19d30 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
19d40 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
19d50 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
19d60 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
19d70 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
19d80 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
19d90 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
19da0 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
19db0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
19dc0 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
19dd0 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
19de0 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
19df0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
19e00 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
19e10 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
19e20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
19e30 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
19e40 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
19e50 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
19e60 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
19e70 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
19e80 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
19e90 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
19ea0 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
19eb0 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
19ec0 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
19ed0 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
19ee0 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
19ef0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
19f00 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
19f10 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
19f20 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  ->u.r)==8 );.   
19f30 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
19f40 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65  Float(x);.    me
19f50 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c  mcpy(&pMem->u.r,
19f60 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
19f70 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
19f80 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
19f90 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d  pMem->u.r) ? MEM
19fa0 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
19fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
19fc0 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
19fd0 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
19fe0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
19ff0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
1a000 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
1a010 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
1a020 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1a030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a040 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
1a050 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
1a060 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
1a090 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
1a0a0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
1a0b0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1a0c0 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
1a0d0 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
1a0e0 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
1a0f0 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
1a100 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
1a110 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
1a120 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75  case 0: {  /* Nu
1a130 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ll */.      /* E
1a140 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
1a150 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20  078-09375 Value 
1a160 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  is a NULL. */.  
1a170 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a180 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
1a190 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a1a0 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
1a1b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a1c0 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36  F: R-44885-25196
1a1d0 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62   Value is an 8-b
1a1e0 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
1a1f0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  nt.      ** inte
1a200 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1a210 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59  em->u.i = ONE_BY
1a220 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1a230 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a240 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a250 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a260 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1a270 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1a280 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
1a290 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
1a2a0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1a2b0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a2c0 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c  -49794-35026 Val
1a2d0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1a2e0 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20  an 16-bit.      
1a2f0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1a300 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1a310 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a320 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75   TWO_BYTE_INT(bu
1a330 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a340 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a350 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a360 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a370 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1a380 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1a390 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1a3a0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a3b0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a3c0 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34  E-OF: R-37839-54
1a3d0 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62  301 Value is a b
1a3e0 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74  ig-endian 24-bit
1a3f0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1a400 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a410 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1a420 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59  ->u.i = THREE_BY
1a430 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1a440 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a450 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a460 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a470 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1a480 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
1a490 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
1a4a0 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
1a4b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1a4c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a4d0 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c  -01849-26079 Val
1a4e0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1a4f0 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20  an 32-bit.      
1a500 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1a510 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1a520 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a530 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62   FOUR_BYTE_INT(b
1a540 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50  uf);.#ifdef __HP
1a550 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f  _cc .      /* Wo
1a560 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e  rk around a sign
1a570 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69  -extension bug i
1a580 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65  n the HP compile
1a590 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20  r for HP/UX */. 
1a5a0 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26       if( buf[0]&
1a5b0 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69  0x80 ) pMem->u.i
1a5c0 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30   |= 0xffffffff80
1a5d0 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66  000000LL;.#endif
1a5e0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1a5f0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1a600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1a610 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1a620 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
1a630 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1a640 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1a650 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1a660 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a670 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34  F: R-50385-09674
1a680 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1a690 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20  endian 48-bit.  
1a6a0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1a6b0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1a6c0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a6d0 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
1a6e0 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
1a6f0 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1a700 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1a710 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a720 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1a730 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1a740 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1a750 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
1a760 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
1a770 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1a780 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
1a790 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
1a7a0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1a7b0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
1a7c0 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
1a7d0 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
1a7e0 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
1a7f0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
1a800 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
1a810 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
1a820 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
1a830 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
1a840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
1a850 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
1a860 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
1a870 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1a880 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
1a890 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
1a8a0 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
1a8b0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a8c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36  ENCE-OF: R-12976
1a8d0 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20  -22893 Value is 
1a8e0 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a  the integer 0. *
1a8f0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a900 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d  NCE-OF: R-18143-
1a910 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74  12121 Value is t
1a920 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f  he integer 1. */
1a930 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a940 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
1a950 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1a960 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1a970 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1a980 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1a990 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1a9a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30  DENCE-OF: R-1460
1a9b0 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73  6-31564 Value is
1a9c0 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20   a BLOB that is 
1a9d0 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69  (N-12)/2 bytes i
1a9e0 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74  n.      ** lengt
1a9f0 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  h..      ** EVID
1aa00 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31  ENCE-OF: R-28401
1aa10 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20  -00140 Value is 
1aa20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
1aa30 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e  text encoding an
1aa40 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33  d.      ** (N-13
1aa50 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  )/2 bytes in len
1aa60 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74  gth. */.      st
1aa70 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
1aa80 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
1aa90 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
1aaa0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
1aab0 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   };.      pMem->
1aac0 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
1aad0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1aae0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1aaf0 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
1ab00 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73  >flags = aFlag[s
1ab10 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20  erial_type&1];. 
1ab20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d       return pMem
1ab30 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ->n;.    }.  }. 
1ab40 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a   return 0;.}./*.
1ab50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ab60 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
1ab70 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
1ab80 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
1ab90 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
1aba0 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
1abb0 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
1abc0 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
1abd0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
1abe0 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
1abf0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1ac00 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
1ac10 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
1ac20 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
1ac30 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
1ac40 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
1ac50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1ac60 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
1ac70 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
1ac80 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
1ac90 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
1aca0 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
1acb0 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
1acc0 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
1acd0 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
1ace0 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
1acf0 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
1ad00 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1ad10 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
1ad20 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
1ad30 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
1ad40 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
1ad50 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
1ad60 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
1ad70 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
1ad80 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
1ad90 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1ada0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
1adb0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
1adc0 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
1add0 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
1ade0 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
1adf0 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
1ae00 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
1ae10 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
1ae20 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1ae30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
1ae40 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1ae50 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55  record */.){.  U
1ae60 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1ae70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ae80 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1ae90 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1aea0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1aed0 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
1aee0 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d   *p */.  nByte =
1aef0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1af00 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1af10 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1af20 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1af30 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 63  1);.  p = (Unpac
1af40 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
1af50 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
1af60 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
1af70 74 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20  te);.  if( !p ) 
1af80 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61  return 0;.  p->a
1af90 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
1afa0 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
1afb0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1afc0 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
1afd0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1afe0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1aff0 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
1b000 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
1b010 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
1b020 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
1b030 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1b040 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
1b050 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
1b060 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
1b070 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
1b080 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
1b090 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
1b0a0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1b0b0 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1b0c0 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
1b0d0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
1b0e0 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
1b0f0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1b100 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
1b110 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1b120 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
1b130 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1b140 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
1b150 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
1b160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b170 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
1b180 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
1b190 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1b1a0 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
1b1b0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
1b1c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
1b1d0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1b1e0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
1b1f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1b200 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1b210 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1b220 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1b230 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1b240 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
1b250 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b270 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
1b280 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
1b290 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1b2c0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1b2d0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
1b2e0 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
1b2f0 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
1b300 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
1b310 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1b320 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
1b330 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1b340 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1b350 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
1b360 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
1b370 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
1b380 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
1b390 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1b3a0 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1b3b0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
1b3c0 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
1b3d0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
1b3e0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1b3f0 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
1b400 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1b410 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
1b420 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
1b430 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b440 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
1b450 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
1b460 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1b470 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b      pMem->z = 0;
1b480 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
1b490 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1b4a0 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
1b4b0 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
1b4c0 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28   pMem++;.    if(
1b4d0 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c   (++u)>=p->nFiel
1b4e0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
1b4f0 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
1b500 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
1b510 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
1b520 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = u;.}..#ifdef S
1b530 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1b540 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b550 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
1b560 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
1b570 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
1b580 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
1b590 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
1b5a0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
1b5b0 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
1b5c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1b5d0 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1b5e0 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
1b5f0 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
1b600 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
1b610 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b620 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
1b630 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
1b640 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
1b650 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
1b660 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b670 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1b680 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
1b690 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
1b6a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b6b0 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
1b6c0 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
1b6d0 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
1b6e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1b6f0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1b700 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
1b710 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
1b720 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
1b730 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
1b740 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
1b750 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
1b760 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1b770 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
1b780 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1b790 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1b7a0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
1b7b0 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
1b7c0 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
1b7d0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1b7e0 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b800 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
1b810 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1b820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b830 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b840 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1b850 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
1b860 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
1b870 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1b880 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
1b890 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
1b8a0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1b8b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b8c0 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
1b8d0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
1b8e0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
1b8f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b900 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1b910 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b920 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
1b930 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1b940 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
1b950 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1b960 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
1b970 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
1b980 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1b990 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1b9a0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
1b9b0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1b9c0 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
1b9d0 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
1b9e0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1b9f0 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
1ba00 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
1ba10 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1ba20 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1ba30 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1ba40 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1ba50 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
1ba60 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
1ba70 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
1ba80 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
1ba90 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1baa0 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
1bab0 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
1bac0 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
1bad0 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
1bae0 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
1baf0 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
1bb00 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
1bb10 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
1bb20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
1bb30 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
1bb40 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
1bb50 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
1bb60 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
1bb70 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
1bb80 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
1bb90 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
1bba0 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
1bbb0 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
1bbc0 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
1bbd0 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
1bbe0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1bbf0 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
1bc00 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
1bc10 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1bc20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
1bc30 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
1bc40 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
1bc50 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
1bc60 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
1bc70 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1bc80 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1bc90 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
1bca0 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
1bcb0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
1bcc0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
1bcd0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1bce0 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
1bcf0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1bd00 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
1bd10 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1bd20 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1bd30 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1bd40 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1bd50 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1bd60 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1bd70 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1bd80 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1bd90 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
1bda0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
1bdb0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
1bdc0 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
1bdd0 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
1bde0 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
1bdf0 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
1be00 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
1be10 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
1be20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1be30 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
1be40 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
1be50 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
1be60 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
1be70 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
1be80 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
1be90 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
1bea0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
1beb0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1bec0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
1bed0 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
1bee0 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
1bef0 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
1bf00 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
1bf10 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
1bf20 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
1bf30 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
1bf40 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
1bf50 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1bf60 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
1bf70 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
1bf80 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
1bf90 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
1bfa0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1bfb0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
1bfc0 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
1bfd0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
1bfe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bff0 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
1c000 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
1c010 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
1c020 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1c030 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1c040 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1c050 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
1c060 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
1c070 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
1c080 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
1c090 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
1c0a0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
1c0b0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1c0c0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
1c0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1c0e0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1c0f0 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1c100 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1c110 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1c120 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1c130 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1c140 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1c150 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1c160 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1c170 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1c180 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1c190 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1c1a0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1c1b0 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1c1c0 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1c1d0 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1c1e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1c1f0 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1c200 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1c210 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1c220 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1c230 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1c240 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1c250 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1c260 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1c270 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1c280 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1c290 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1c2a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1c2b0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1c2c0 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1c2d0 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1c2e0 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1c2f0 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1c300 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1c310 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1c320 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1c330 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1c340 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1c350 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1c360 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1c370 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1c380 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1c390 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1c3a0 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1c3b0 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1c3c0 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1c3d0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1c3e0 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1c3f0 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1c400 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1c410 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1c420 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1c430 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1c440 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1c450 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1c460 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1c470 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1c480 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1c490 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1c4a0 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1c4b0 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1c4c0 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1c4d0 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1c4e0 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1c4f0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1c500 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1c510 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1c520 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1c530 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
1c540 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1c550 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1c560 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1c570 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1c580 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1c590 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c5a0 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1c5b0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1c5c0 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1c5d0 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1c5e0 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1c5f0 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1c600 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1c610 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1c620 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
1c630 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1c640 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
1c650 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1c660 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1c670 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1c680 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1c690 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1c6a0 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1c6b0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1c6c0 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1c6d0 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1c6e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c6f0 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1c700 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1c710 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1c720 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1c730 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1c740 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1c750 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1c760 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c770 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1c780 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1c790 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1c7a0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1c7b0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1c7c0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1c7d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1c7e0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1c7f0 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1c800 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1c810 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1c820 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1c830 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1c840 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1c850 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1c860 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1c870 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1c880 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1c890 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1c8a0 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1c8b0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1c8c0 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1c8d0 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1c8e0 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1c8f0 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1c900 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1c910 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1c920 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1c930 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1c940 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1c950 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1c960 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1c970 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1c980 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1c990 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1c9a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1c9b0 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1c9c0 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1c9d0 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1c9e0 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1c9f0 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1ca00 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1ca10 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1ca20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1ca30 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1ca40 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1ca50 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1ca60 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1ca90 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1caa0 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1cab0 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1cac0 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1cad0 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1cae0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1caf0 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1cb00 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1cb10 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1cb20 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1cb30 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1cb40 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1cb50 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1cb60 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1cb70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1cb80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cb90 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1cba0 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1cbb0 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
1cbc0 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1cbd0 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1cbe0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1cbf0 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1cc00 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1cc10 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1cc20 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1cc30 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1cc40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1cc50 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1cc60 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1cc70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cc80 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1cc90 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1cca0 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1ccb0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1ccc0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1ccd0 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1cce0 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
1ccf0 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
1cd00 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1cd10 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1cd20 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1cd30 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1cd40 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
1cd50 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
1cd60 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1cd70 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
1cd80 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 69  , n2, v2);.    i
1cd90 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1cda0 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20  =0) && prcErr ) 
1cdb0 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1cdc0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1cdd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1cde0 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1cdf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ce00 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1ce10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ce20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
1ce30 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72  ut pBlob is guar
1ce40 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42  anteed to be a B
1ce50 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lob that is not 
1ce60 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d  marked.** with M
1ce70 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e  EM_Zero.  Return
1ce80 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c   true if it coul
1ce90 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62  d be a zero-blob
1cea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ceb0 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20  isAllZero(const 
1cec0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
1ced0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1cee0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1cef0 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72      if( z[i] ) r
1cf00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1cf10 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1cf20 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c  * Compare two bl
1cf30 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  obs.  Return neg
1cf40 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1cf50 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1cf60 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73  first.** is less
1cf70 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1cf80 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1cf90 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73   the second, res
1cfa0 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66  pectively..** If
1cfb0 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70   one blob is a p
1cfc0 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
1cfd0 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f  er, then the sho
1cfe0 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73  rter is the less
1cff0 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  or..*/.static SQ
1d000 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1d010 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1d020 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1d030 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1d040 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  pB2){.  int c;. 
1d050 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e   int n1 = pB1->n
1d060 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32  ;.  int n2 = pB2
1d070 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  ->n;..  /* It is
1d080 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
1d090 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74  e a Blob value t
1d0a0 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e  hat has some non
1d0b0 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20  -zero content.  
1d0c0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  ** followed by z
1d0d0 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75  ero content.  Bu
1d0e0 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65  t that only come
1d0f0 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66  s up for Blobs f
1d100 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ormed.  ** by th
1d110 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1d120 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68  opcode, and such
1d130 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74   Blobs never get
1d140 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1d150 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  * sqlite3MemComp
1d160 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  are(). */.  asse
1d170 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20  rt( (pB1->flags 
1d180 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1d190 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73  | n1==0 );.  ass
1d1a0 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73  ert( (pB2->flags
1d1b0 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1d1c0 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69  || n2==0 );..  i
1d1d0 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70  f( (pB1->flags|p
1d1e0 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  B2->flags) & MEM
1d1f0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28  _Zero ){.    if(
1d200 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42   pB1->flags & pB
1d210 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1d220 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ero ){.      ret
1d230 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1d240 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1d250 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1d260 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1d270 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
1d280 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32  ( !isAllZero(pB2
1d290 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72  ->z, pB2->n) ) r
1d2a0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d2b0 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1d2c0 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65  ero - n2;.    }e
1d2d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
1d2e0 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a  isAllZero(pB1->z
1d2f0 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75  , pB1->n) ) retu
1d300 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1d310 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e  urn n1 - pB2->u.
1d320 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  nZero;.    }.  }
1d330 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  .  c = memcmp(pB
1d340 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31  1->z, pB2->z, n1
1d350 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a  >n2 ? n2 : n1);.
1d360 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1d370 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20   c;.  return n1 
1d380 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  - n2;.}../*.** D
1d390 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1d3a0 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1d3b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1d3c0 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1d3d0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1d3e0 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1d3f0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1d400 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1d410 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1d420 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1d430 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1d440 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1d450 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1d460 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1d470 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1d480 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1d490 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1d4a0 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1d4b0 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1d4c0 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1d4d0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1d4e0 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1d4f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d500 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1d510 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1d520 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1d530 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1d540 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1d550 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1d560 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1d570 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32  1;.    if( r>922
1d580 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
1d590 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1d5a0 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1d5b0 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1d5c0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1d5d0 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66   i>y ){.      if
1d5e0 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  ( y==SMALLEST_IN
1d5f0 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72  T64 && r>0.0 ) r
1d600 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d610 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d  return +1;.    }
1d620 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65  .    s = (double
1d630 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20  )i;.    if( s<r 
1d640 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d650 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72   if( s>r ) retur
1d660 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1d670 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1d680 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
1d690 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
1d6a0 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
1d6b0 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
1d6c0 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
1d6d0 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
1d6e0 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
1d6f0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1d700 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
1d710 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
1d720 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
1d730 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
1d740 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
1d750 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
1d760 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
1d770 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
1d780 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
1d790 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
1d7a0 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
1d7b0 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
1d7c0 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
1d7d0 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
1d7e0 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
1d7f0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1d800 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
1d810 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1d820 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1d830 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
1d840 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
1d850 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
1d860 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
1d870 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
1d880 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
1d890 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
1d8a0 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
1d8b0 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
1d8c0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
1d8d0 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
1d8e0 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
1d8f0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
1d900 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
1d910 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
1d920 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
1d930 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
1d940 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
1d950 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
1d960 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
1d970 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1d980 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
1d990 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
1d9a0 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
1d9b0 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ll);.  }..  /* A
1d9c0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
1d9d0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73  he two values is
1d9e0 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20   a number.  */. 
1d9f0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1da00 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
1da10 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66  _Real) ){.    if
1da20 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1da30 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1da40 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1da50 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1da60 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1da70 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1da80 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1da90 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1daa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1dab0 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1dac0 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20   & MEM_Real)!=0 
1dad0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1dae0 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d  m1->u.r < pMem2-
1daf0 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.r ) return -1
1db00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1db10 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.r > pMem2->
1db20 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.r ) return +1;
1db30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1db40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1db50 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
1db60 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1db70 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1db80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1db90 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1dba0 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69  mpare(pMem1->u.i
1dbb0 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20  , pMem2->u.r);. 
1dbc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dbd0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1dbe0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dbf0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1dc00 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1dc10 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21  f( (f2&MEM_Int)!
1dc20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1dc30 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74  turn -sqlite3Int
1dc40 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1dc50 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e  m2->u.i, pMem1->
1dc60 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1dc70 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1dc80 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1dc90 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b    }.    return +
1dca0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1dcb0 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1dcc0 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1dcd0 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1dce0 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1dcf0 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1dd00 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1dd10 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1dd20 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1dd30 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1dd40 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1dd50 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1dd60 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1dd70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1dd80 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1dd90 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1dda0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1ddb0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1ddc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1ddd0 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1dde0 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62  enc || pMem1->db
1ddf0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1de00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
1de10 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1de20 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
1de30 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
1de40 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
1de50 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
1de60 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1de70 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1de80 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1de90 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
1dea0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1deb0 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
1dec0 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
1ded0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1dee0 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
1def0 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
1df00 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
1df10 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
1df20 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
1df30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1df40 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
1df50 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
1df60 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1df70 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1df80 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1df90 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
1dfa0 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Coll, 0);.    }.
1dfb0 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c      /* If a NULL
1dfc0 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73   pointer was pas
1dfd0 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61  sed as the colla
1dfe0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c  te function, fal
1dff0 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  l through.    **
1e000 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73   to the blob cas
1e010 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70  e and use memcmp
1e020 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20  ().  */.  }. .  
1e030 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d  /* Both values m
1e040 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43  ust be blobs.  C
1e050 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d  ompare using mem
1e060 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74  cmp().  */.  ret
1e070 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  urn sqlite3BlobC
1e080 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d  ompare(pMem1, pM
1e090 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  em2);.}.../*.** 
1e0a0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1e0b0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1e0c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1e0d0 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74  serial-type that
1e0e0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1e0f0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  to an integer - 
1e100 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65  all values betwe
1e110 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75  en 1 and 9 inclu
1e120 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20  sive .** except 
1e130 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f  7. The second po
1e140 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1e150 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69   containing an i
1e160 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20  nteger value.** 
1e170 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72  serialized accor
1e180 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74  ding to serial_t
1e190 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ype. This functi
1e1a0 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a  on deserializes.
1e1b0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
1e1c0 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  he value..*/.sta
1e1d0 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f  tic i64 vdbeReco
1e1e0 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20  rdDecodeInt(u32 
1e1f0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e  serial_type, con
1e200 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
1e210 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28  u32 y;.  assert(
1e220 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28   CORRUPT_DB || (
1e230 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26  serial_type>=1 &
1e240 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39  & serial_type<=9
1e250 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21   && serial_type!
1e260 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =7) );.  switch(
1e270 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1e280 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
1e290 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65  case 1:.      te
1e2a0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e2b0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1e2c0 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  turn ONE_BYTE_IN
1e2d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1e2e0 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 2:.      testc
1e2f0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e300 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1e310 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  n TWO_BYTE_INT(a
1e320 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33  Key);.    case 3
1e330 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e340 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e350 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1e360 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1e370 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  ey);.    case 4:
1e380 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e390 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e3a0 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
1e3b0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e3c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e3d0 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1e3e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1e3f0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e400 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1e410 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e420 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1e430 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1e440 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1e450 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e460 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1e470 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46  .      u64 x = F
1e480 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e490 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1e4a0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e4b0 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  0 );.      x = (
1e4c0 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1e4d0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1e4e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1e4f0 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20  64)*(i64*)&x;.  
1e500 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1e510 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  n (serial_type -
1e520 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   8);.}../*.** Th
1e530 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1e540 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
1e550 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
1e560 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
1e570 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
1e580 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
1e590 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
1e5a0 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
1e5b0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1e5c0 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
1e5d0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1e5e0 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
1e5f0 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
1e600 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
1e610 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
1e620 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
1e630 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1e640 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
1e650 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
1e660 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
1e670 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
1e680 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
1e690 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
1e6a0 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
1e6b0 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ord..**.** If ar
1e6c0 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20  gument bSkip is 
1e6d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20  non-zero, it is 
1e6e0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1e6f0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1e700 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ady.** determine
1e710 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1e720 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
1e730 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a  eys are equal..*
1e740 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
1e750 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
1e760 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
1e770 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
1e780 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20  lds. If all .** 
1e790 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65  fields that appe
1e7a0 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20  ar in both keys 
1e7b0 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
1e7c0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1e7d0 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  rc is .** return
1e7e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  ed..**.** If dat
1e7f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e800 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20   is discovered, 
1e810 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  set pPKey2->errC
1e820 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  ode to .** SQLIT
1e830 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65  E_CORRUPT and re
1e840 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f  turn 0. If an OO
1e850 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
1e860 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65  ntered, .** pPKe
1e870 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73  y2->errCode is s
1e880 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1e890 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73  EM and, if it is
1e8a0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a   not NULL, the.*
1e8b0 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  * malloc-failed 
1e8c0 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61  flag set on data
1e8d0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b  base handle (pPK
1e8e0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1e8f0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
1e900 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1e910 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69  areWithSkip(.  i
1e920 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1e930 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1e940 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1e950 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1e960 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1e970 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1e980 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1e9b0 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1e9c0 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1e9d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1e9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1e9f0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1ea00 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1ea10 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1ea20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1ea40 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1ea50 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1ea60 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1ea90 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1eaa0 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1eab0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1eac0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1ead0 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1eae0 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1eaf0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1eb20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1eb30 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1eb40 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1eb50 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1eb60 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1eb70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1eb80 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1eb90 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1eba0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1ebb0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1ebc0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1ebd0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1ebe0 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1ebf0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1ec00 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1ec10 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1ec20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1ec30 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1ec40 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1ec50 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1ec60 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1ec70 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1ec80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1ec90 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1eca0 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1ecb0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1ecc0 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1ecd0 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1ece0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ecf0 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1ed00 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1ed10 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1ed20 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
1ed30 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
1ed40 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
1ed50 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
1ed60 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
1ed70 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1ed80 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
1ed90 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
1eda0 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
1edb0 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
1edc0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1edd0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1ede0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1edf0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1ee00 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1ee10 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
1ee20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
1ee30 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1ee40 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1ee50 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1ee60 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
1ee70 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1ee80 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1ee90 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1eea0 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1eeb0 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
1eec0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1eed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1eee0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
1eef0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1ef00 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1ef10 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1ef20 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1ef30 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1ef40 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1ef50 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1ef60 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1ef70 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74  /* RHS is an int
1ef80 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  eger */.    if( 
1ef90 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1efa0 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  M_Int ){.      s
1efb0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1efc0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1efd0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1efe0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1eff0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1f000 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1f010 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1f020 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1f030 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1f040 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f050 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1f060 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1f070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f080 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1f090 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1f0a0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1f0b0 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69        rc = -sqli
1f0c0 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1f0d0 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65  re(pRhs->u.i, me
1f0e0 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m1.u.r);.      }
1f0f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1f100 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
1f110 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
1f120 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
1f130 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
1f140 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
1f150 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
1f160 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1f170 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1f180 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1f190 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1f1a0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f1c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1f1d0 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
1f1e0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1f1f0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1f200 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1f210 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1f220 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
1f230 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1f240 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
1f250 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
1f260 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
1f270 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
1f280 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
1f290 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
1f2a0 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
1f2b0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
1f2c0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1f2d0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
1f2e0 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
1f2f0 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
1f300 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
1f310 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
1f320 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
1f330 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
1f340 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
1f350 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1f360 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1f370 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1f380 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f390 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f3a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1f3b0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1f3c0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1f3d0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1f3e0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f3f0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1f400 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70    if( mem1.u.r<p
1f410 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
1f420 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1f430 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f440 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52   if( mem1.u.r>pR
1f450 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
1f460 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1f470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f490 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f4a0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f4b0 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d  (mem1.u.i, pRhs-
1f4c0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  >u.r);.        }
1f4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f4e0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1f4f0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1f500 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1f510 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1f520 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1f530 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1f540 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1f550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1f560 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1f570 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1f580 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1f590 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f5a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1f5b0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1f5c0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1f5d0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1f5e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1f5f0 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1f600 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1f610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f620 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1f630 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1f640 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f650 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1f660 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1f670 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f680 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1f690 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1f6a0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1f6b0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1f6c0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1f6d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1f6e0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1f700 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1f710 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1f720 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1f730 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1f740 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1f750 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1f760 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1f770 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1f780 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1f790 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1f7a0 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1f7b0 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1f7c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1f7d0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1f7e0 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1f7f0 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1f800 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1f810 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1f820 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1f830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f840 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1f850 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1f860 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1f870 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1f880 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1f890 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1f8a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1f8b0 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1f8c0 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1f8d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f8e0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1f8f0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1f900 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1f910 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1f920 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f930 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d  (pRhs->flags & M
1f940 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70  EM_Zero)==0 || p
1f950 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  Rhs->n==0 );.   
1f960 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1f970 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1f980 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1f990 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1f9a0 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1f9b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f9c0 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
1f9d0 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1f9e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f9f0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1fa00 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
1fa10 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1fa20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1fa30 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1fa40 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
1fa50 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1fa60 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1fa70 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
1fa80 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1fa90 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
1faa0 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
1fab0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1fac0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1fad0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1fae0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1faf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1fb20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1fb30 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1fb40 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1fb50 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c         if( !isAl
1fb60 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61  lZero((const cha
1fb70 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53  r*)&aKey1[d1],nS
1fb80 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tr) ){.         
1fb90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
1fba0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fbb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74          rc = nSt
1fbc0 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72  r - pRhs->u.nZer
1fbd0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
1fbe0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fbf0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1fc00 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
1fc10 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1fc20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1fc30 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1fc40 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1fc50 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1fc60 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1fc70 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
1fc80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fc90 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
1fca0 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
1fcb0 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1fcc0 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1fcd0 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
1fce0 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
1fcf0 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
1fd00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  ){.      if( pKe
1fd10 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1fd20 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1fd30 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
1fd40 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1fd50 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1fd60 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1fd70 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
1fd80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fd90 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1fda0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1fdb0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1fdc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fdd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
1fde0 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20      pRhs++;.    
1fdf0 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1fe00 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1fe10 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1fe20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
1fe30 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
1fe40 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  _type);.  }while
1fe50 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64  ( idx1<(unsigned
1fe60 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  )szHdr1 && i<pPK
1fe70 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  ey2->nField && d
1fe80 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
1fe90 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
1fea0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1feb0 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1fec0 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1fed0 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1fee0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1fef0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1ff00 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1ff10 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1ff20 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1ff30 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1ff40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ff50 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
1ff60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1ff70 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1ff80 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1ff90 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1ffa0 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
1ffb0 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1ffc0 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1ffd0 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1ffe0 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1fff0 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
20000 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
20010 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
20020 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
20030 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
20040 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
20050 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
20060 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
20070 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
20080 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b  c) .       || pK
20090 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
200a0 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
200b0 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
200c0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   1;.  return pPK
200d0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
200e0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
200f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20100 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
20110 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
20120 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
20130 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
20140 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
20150 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
20160 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
20170 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20180 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
20190 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
201a0 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  PKey2, 0);.}.../
201b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
201c0 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
201d0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
201e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
201f0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
20200 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
20210 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
20220 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  is an integer, a
20230 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73  nd (b) the .** s
20240 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
20250 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  rint at the star
20260 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
20270 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
20280 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65  gle.** byte (i.e
20290 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  . is less than 1
202a0 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  28)..**.** To av
202b0 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f  oid concerns abo
202c0 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ut buffer overre
202d0 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ads, this routin
202e0 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a  e is only used.*
202f0 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65  * on schemas whe
20300 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  re the maximum v
20310 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65  alid header size
20320 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20   is 63 bytes or 
20330 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
20340 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
20350 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20  mpareInt(.  int 
20360 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
20370 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
20380 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
20390 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
203a0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
203b0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
203c0 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
203d0 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
203e0 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
203f0 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
20400 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
20410 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
20420 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
20430 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
20440 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20  64 x;.  i64 v;. 
20450 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62   i64 lhs;..  vdb
20460 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
20470 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
20480 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20490 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
204a0 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29   assert( (*(u8*)
204b0 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20  pKey1)<=0x3F || 
204c0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
204d0 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
204e0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
204f0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
20500 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
20510 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45  .      lhs = ONE
20520 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20530 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20540 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
20550 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20560 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
20570 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20580 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
20590 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
205a0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
205b0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
205c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
205d0 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
205e0 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
205f0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20600 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42     lhs = THREE_B
20610 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20630 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20640 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20650 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
20660 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
20670 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
20680 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20690 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
206a0 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
206b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
206c0 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
206d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
206e0 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
206f0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20700 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
20710 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
20720 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
20730 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
20740 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20750 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20760 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20770 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20780 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79  ase 6: { /* 8-by
20790 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
207a0 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46  r */.      x = F
207b0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
207c0 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  ey);.      x = (
207d0 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
207e0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
207f0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69  .      lhs = *(i
20800 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65  64*)&x;.      te
20810 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
20820 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20830 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
20840 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a  .      lhs = 0;.
20850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20860 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c   case 9:.      l
20870 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  hs = 1;.      br
20880 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  eak;..    /* Thi
20890 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20  s case could be 
208a0 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20  removed without 
208b0 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73  changing the res
208c0 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a  ults of running.
208d0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
208e0 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63  . Including it c
208f0 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e  auses gcc to gen
20900 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73  erate a faster s
20910 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74  witch .    ** st
20920 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74  atement (since t
20930 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74  he range of swit
20940 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73  ch targets now s
20950 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e  tarts at zero an
20960 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74  d.    ** is cont
20970 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73  iguous) but does
20980 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64   not cause any d
20990 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f  uplicate code to
209a0 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20   be generated.  
209b0 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20    ** (as gcc is 
209c0 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f  clever enough to
209d0 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f   combine the two
209e0 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74   like cases). Ot
209f0 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  her .    ** comp
20a00 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73  ilers might be s
20a10 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20  imilar.  */ .   
20a20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a   case 0: case 7:
20a30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20a40 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20a50 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
20a60 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20  ey1, pPKey2);.. 
20a70 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
20a80 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20a90 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20aa0 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
20ab0 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20  pPKey2);.  }..  
20ac0 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  v = pPKey2->aMem
20ad0 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76  [0].u.i;.  if( v
20ae0 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
20af0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
20b00 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
20b10 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
20b20 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
20b30 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
20b40 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
20b50 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
20b60 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
20b70 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
20b80 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
20b90 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
20ba0 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
20bb0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20bc0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
20bd0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20be0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Key2, 1);.  }els
20bf0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e{.    /* The fi
20c00 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
20c10 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
20c20 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61  qual and there a
20c30 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20  re no trailing. 
20c40 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65     ** fields. Re
20c50 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
20c60 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20  ault_rc in this 
20c70 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73  case. */.    res
20c80 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
20c90 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79  lt_rc;.    pPKey
20ca0 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
20cb0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
20cc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
20cd0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
20ce0 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
20cf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
20d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20d10 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
20d20 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
20d30 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
20d40 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
20d50 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
20d60 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
20d70 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
20d80 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
20d90 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
20da0 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
20db0 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
20dc0 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
20dd0 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
20de0 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
20df0 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
20e00 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
20e10 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
20e20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
20e30 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20e40 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
20e50 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
20e60 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
20e70 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
20e80 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
20e90 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
20ea0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
20eb0 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
20ec0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
20ed0 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
20ee0 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
20ef0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
20f00 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26  >aMem[0].flags &
20f10 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64   MEM_Str );.  vd
20f20 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
20f30 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
20f40 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20f50 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
20f60 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
20f70 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
20f80 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
20f90 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
20fa0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20fb0 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
20fc0 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
20fd0 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
20fe0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
20ff0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
21000 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
21010 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
21020 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
21030 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
21040 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
21050 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
21060 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
21070 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
21080 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
21090 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
210a0 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
210b0 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
210c0 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
210d0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
210e0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
210f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
21100 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
21110 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
21120 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
21130 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21140 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
21150 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
21160 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
21170 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
21180 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
21190 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
211a0 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
211b0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
211c0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
211d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
211e0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
211f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
21200 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
21210 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
21220 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
21230 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
21240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21250 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
21260 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
21270 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
21280 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
21290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
212a0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
212b0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
212c0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
212d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
212e0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
212f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
21300 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
21310 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
21320 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
21330 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
21340 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
21350 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
21360 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
21370 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
21380 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
21390 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
213a0 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
213b0 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
213c0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
213d0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
213e0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
213f0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
21400 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
21410 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21420 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
21430 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
21440 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
21450 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
21460 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
21470 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
21480 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
21490 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
214a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
214b0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
214c0 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
214d0 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
214e0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
214f0 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
21500 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
21510 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
21520 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
21530 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
21540 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
21550 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
21560 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
21570 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
21580 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
21590 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
215a0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
215b0 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
215c0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
215d0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
215e0 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
215f0 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
21600 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
21610 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
21620 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
21630 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
21640 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
21650 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
21660 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
21670 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
21680 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
21690 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
216a0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
216b0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
216c0 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
216d0 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
216e0 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
216f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
21700 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
21710 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
21720 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
21730 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
21740 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
21750 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
21760 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
21770 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
21780 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
21790 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
217a0 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
217b0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
217c0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
217d0 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
217e0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
217f0 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
21800 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
21810 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
21820 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
21830 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
21840 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
21850 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
21860 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
21870 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
21880 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
21890 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
218a0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
218b0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
218c0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
218d0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
218e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
218f0 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
21900 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
21910 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
21920 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
21930 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
21940 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
21950 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21960 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
21970 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21980 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
21990 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
219a0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
219b0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
219c0 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
219d0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
219e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
219f0 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
21a00 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
21a10 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
21a20 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
21a30 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21a40 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
21a50 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
21a60 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
21a70 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
21a80 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
21a90 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
21aa0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
21ab0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
21ac0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
21ad0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
21ae0 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
21af0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
21b00 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
21b10 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
21b20 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
21b30 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
21b40 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
21b50 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
21b60 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
21b70 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
21b80 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
21b90 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
21ba0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
21bb0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
21bc0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
21bd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
21be0 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
21bf0 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
21c00 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
21c10 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
21c20 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
21c30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
21c40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
21c50 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
21c60 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
21c70 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
21c80 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
21c90 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
21ca0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
21cb0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
21cc0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
21cd0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
21ce0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
21cf0 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
21d00 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
21d10 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
21d20 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
21d30 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
21d40 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
21d50 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
21d60 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
21d70 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
21d80 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
21d90 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
21da0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
21db0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
21dc0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
21dd0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
21de0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
21df0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
21e00 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
21e10 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    nCellKey = sql
21e20 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
21e30 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73  Size(pCur);.  as
21e40 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
21e50 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
21e60 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
21e70 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
21e80 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
21e90 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
21ea0 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
21eb0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
21ec0 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
21ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
21ee0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
21ef0 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
21f00 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  Key, &m);.  if( 
21f10 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
21f20 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
21f30 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
21f40 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
21f50 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
21f60 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
21f70 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
21f80 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
21f90 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
21fa0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
21fb0 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
21fc0 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
21fd0 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
21fe0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21ff0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
22000 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
22010 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
22020 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
22030 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
22040 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
22050 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
22060 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
22070 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
22080 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
22090 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
220a0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
220b0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
220c0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
220d0 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
220e0 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
220f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
22100 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
22110 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22120 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
22130 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
22140 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
22150 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
22160 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
22170 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
22180 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22190 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
221a0 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
221b0 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
221c0 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
221d0 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
221e0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
221f0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
22200 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
22210 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
22220 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
22230 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
22240 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
22250 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
22260 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
22270 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
22280 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
22290 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
222a0 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
222b0 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
222c0 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
222d0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
222e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
222f0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
22300 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
22310 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
22320 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
22330 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
22340 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
22350 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
22360 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
22370 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
22380 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
22390 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
223a0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
223b0 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
223c0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
223d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
223e0 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
223f0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
22400 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
22410 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
22420 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22430 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22440 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22450 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
22460 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
22470 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
22480 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
22490 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
224a0 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
224b0 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
224c0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
224d0 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
224e0 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
224f0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
22500 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
22510 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
22520 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
22530 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
22540 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22550 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
22560 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
22570 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
22580 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
22590 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
225a0 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
225b0 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
225c0 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
225d0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
225e0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
225f0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
22600 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
22610 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
22620 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
22630 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
22640 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
22650 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
22660 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
22670 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
22680 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
22690 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
226a0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
226b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
226c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
226d0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
226e0 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
226f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22700 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
22710 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
22720 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22730 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
22740 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
22750 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
22760 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
22790 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
227a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
227b0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
227c0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
227d0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
227e0 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
227f0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
22800 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
22810 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
22820 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
22830 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22840 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
22850 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
22860 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
22870 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
22880 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
22890 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
228a0 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
228b0 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
228c0 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
228d0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
228e0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
228f0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
22900 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
22910 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
22920 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
22930 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
22940 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
22950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22960 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22970 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22980 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
22990 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
229a0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
229b0 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
229c0 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
229d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
229e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
229f0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
22a00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
22a10 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
22a20 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
22a30 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22a40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22a50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
22a60 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
22a70 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
22a80 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
22a90 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
22aa0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
22ab0 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
22ac0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
22ad0 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
22ae0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
22af0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
22b00 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
22b10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22b20 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
22b30 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
22b40 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
22b50 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
22b60 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
22b70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
22b80 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
22b90 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
22ba0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
22bb0 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
22bc0 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
22bd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
22be0 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
22bf0 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
22c00 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
22c10 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
22c20 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
22c30 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
22c40 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
22c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
22c60 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
22c70 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
22c80 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
22c90 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
22ca0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
22cb0 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
22cc0 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
22cd0 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
22ce0 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
22cf0 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
22d00 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
22d10 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
22d20 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
22d30 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
22d40 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
22d50 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
22d60 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
22d70 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
22d80 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
22d90 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
22da0 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
22db0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22dc0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
22dd0 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
22de0 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
22df0 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
22e00 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
22e10 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
22e20 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
22e30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22e40 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
22e50 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22e60 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
22e70 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
22e80 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
22e90 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
22ea0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
22eb0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
22ec0 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
22ed0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
22ee0 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
22ef0 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
22f00 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
22f10 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
22f20 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
22f30 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
22f40 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
22f50 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
22f60 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
22f70 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
22f80 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
22f90 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
22fa0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
22fb0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
22fc0 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
22fd0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
22fe0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
22ff0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
23000 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
23010 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
23020 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62  etBoundValue(Vdb
23030 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20  e *v, int iVar, 
23040 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72  u8 aff){.  asser
23050 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
23060 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20  f( v ){.    Mem 
23070 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72  *pMem = &v->aVar
23080 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66  [iVar-1];.    if
23090 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
230a0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
230b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
230c0 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
230d0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
230e0 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
230f0 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
23100 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
23110 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
23120 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
23130 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
23140 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
23150 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
23160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
23170 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
23180 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
23190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
231a0 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
231b0 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
231c0 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
231d0 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
231e0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
231f0 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
23200 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
23210 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
23220 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
23230 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
23240 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23250 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
23260 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
23270 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
23280 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
23290 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
232a0 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
232b0 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
232c0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
232d0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
232e0 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
232f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23300 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
23310 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
23320 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
23330 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
23340 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
23350 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
23360 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
23370 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
23380 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
23390 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
233a0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
233b0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
233c0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
233d0 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
233e0 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
233f0 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
23400 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
23410 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e  ){.  if( pVtab->
23420 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73  zErrMsg ){.    s
23430 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
23440 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  db;.    sqlite3D
23450 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
23460 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
23470 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
23480 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
23490 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
234a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
234b0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
234c0 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73     pVtab->zErrMs
234d0 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  g = 0;.  }.}.#en
234e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
234f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
23500 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
23510 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
23520 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49  TE_HOOK../*.** I
23530 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
23540 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
23550 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61  L, release any a
23560 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
23570 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74  iated .** with t
23580 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  he memory cells 
23590 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d  in the p->aMem[]
235a0 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65   array. Also fre
235b0 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65  e the UnpackedRe
235c0 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
235d0 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20  e itself, using 
235e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
235f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23600 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
23610 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63  free UnpackedRec
23620 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20 61  ord structures a
23630 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
23640 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63  he vdbeUnpackRec
23650 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ord() function f
23660 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e  ound in vdbeapi.
23670 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c..*/.static voi
23680 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b  d vdbeFreeUnpack
23690 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
236a0 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61  int nField, Unpa
236b0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
236c0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
236d0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
236e0 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b  0; i<nField; i++
236f0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d  ){.      Mem *pM
23700 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d  em = &p->aMem[i]
23710 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
23720 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  ->zMalloc ) sqli
23730 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23740 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(pMem);.    }. 
23750 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23760 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23  (db, p);.  }.}.#
23770 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
23780 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
23790 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66  _HOOK */..#ifdef
237a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
237b0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
237c0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70  .** Invoke the p
237d0 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20  re-update hook. 
237e0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50  If this is an UP
237f0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70  DATE or DELETE p
23800 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a  re-update call,.
23810 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70  ** then cursor p
23820 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23830 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  ond argument sho
23840 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  uld point to the
23850 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f   row about.** to
23860 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65   be update or de
23870 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70  leted. If the ap
23880 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20  plication calls 
23890 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
238a0 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20  e_old(),.** the 
238b0 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77  required value w
238c0 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
238d0 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
238e0 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  sor points to..*
238f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
23900 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28  bePreUpdateHook(
23910 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75     /* Vdbe pre-u
23940 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e  pdate hook is in
23950 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64  voked by */.  Vd
23960 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  beCursor *pCsr, 
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23980 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20   Cursor to grab 
23990 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f  old.* values fro
239a0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  m */.  int op,  
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
239d0 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20  _INSERT, UPDATE 
239e0 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63  or DELETE */.  c
239f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a10 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
23a20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23a40 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64       /* Modified
23a50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20   table */.  i64 
23a60 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20  iKey1,          
23a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23a80 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65  nitial key value
23a90 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20   */.  int iReg  
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
23ac0 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f  r for new.* reco
23ad0 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  rd */.){.  sqlit
23ae0 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a  e3 *db = v->db;.
23af0 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50    i64 iKey2;.  P
23b00 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61  reUpdate preupda
23b10 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
23b20 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a   *zTbl = pTab->z
23b30 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63  Name;.  static c
23b40 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74  onst u8 fakeSort
23b50 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73  Order = 0;..  as
23b60 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70  sert( db->pPreUp
23b70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  date==0 );.  mem
23b80 73 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20  set(&preupdate, 
23b90 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64  0, sizeof(PreUpd
23ba0 61 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61 73  ate));.  if( Has
23bb0 52 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20 29  Rowid(pTab)==0 )
23bc0 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69 4b  {.    iKey1 = iK
23bd0 65 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72 65  ey2 = 0;.    pre
23be0 75 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c  update.pPk = sql
23bf0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
23c00 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c  dex(pTab);.  }el
23c10 73 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  se{.    if( op==
23c20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
23c30 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 76  .      iKey2 = v
23c40 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69  ->aMem[iReg].u.i
23c50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23c60 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31     iKey2 = iKey1
23c70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
23c80 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69  ssert( pCsr->nFi
23c90 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  eld==pTab->nCol 
23ca0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72  .       || (pCsr
23cb0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
23cc0 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51  nCol+1 && op==SQ
23cd0 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69  LITE_DELETE && i
23ce0 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20  Reg==-1).  );.. 
23cf0 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76   preupdate.v = v
23d00 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43  ;.  preupdate.pC
23d10 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65  sr = pCsr;.  pre
23d20 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a  update.op = op;.
23d30 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77    preupdate.iNew
23d40 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72  Reg = iReg;.  pr
23d50 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
23d60 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70  db = db;.  preup
23d70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63  date.keyinfo.enc
23d80 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72   = ENC(db);.  pr
23d90 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
23da0 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  nField = pTab->n
23db0 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
23dc0 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
23dd0 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  der = (u8*)&fake
23de0 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
23df0 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
23e00 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
23e10 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
23e20 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
23e30 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
23e40 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
23e50 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
23e60 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
23e70 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
23e80 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
23e90 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
23ea0 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
23eb0 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
23ec0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23ed0 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
23ee0 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
23ef0 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
23f00 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
23f10 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
23f20 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
23f30 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
23f40 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
23f50 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31  keyinfo.nField+1
23f60 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77  , preupdate.pNew
23f70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28  Unpacked);.  if(
23f80 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20   preupdate.aNew 
23f90 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23fa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
23fb0 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b  r->nField; i++){
23fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23fd0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72  beMemRelease(&pr
23fe0 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29  eupdate.aNew[i])
23ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24000 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72  te3DbFree(db, pr
24010 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20  eupdate.aNew);. 
24020 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
24030 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
24040 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.