/ Hex Artifact Content
Login

Artifact ef484bc29e56fc309285e92490e3a547a86b7f7ed3a8701d145a60f9e5ac9ad9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 61  se = pParse;.  a
03e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
03f0: 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  Label==0 );.  as
0400: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4c  sert( pParse->nL
0410: 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  abel==0 );.  ass
0420: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4f 70  ert( pParse->nOp
0430: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0440: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0450: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0460: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0470: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 72  ** Change the er
0480: 72 6f 72 20 73 74 72 69 6e 67 20 73 74 6f 72 65  ror string store
0490: 64 20 69 6e 20 56 64 62 65 2e 7a 45 72 72 4d 73  d in Vdbe.zErrMs
04a0: 67 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  g.*/.void sqlite
04b0: 33 56 64 62 65 45 72 72 6f 72 28 56 64 62 65 20  3VdbeError(Vdbe 
04c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
04d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
04e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
04f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
0500: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
0510: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0520: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a  zFormat);.  p->z
0530: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
0540: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
0550: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0560: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
0570: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
0580: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
0590: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
05a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
05b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
05c0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
05d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
05e0: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
05f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0600: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0610: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0620: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0630: 75 72 6e 3b 0a 20 20 69 66 28 20 21 69 73 50 72  urn;.  if( !isPr
0640: 65 70 61 72 65 56 32 20 29 20 70 2d 3e 65 78 70  epareV2 ) p->exp
0650: 6d 61 73 6b 20 3d 20 30 3b 0a 23 69 66 20 64 65  mask = 0;.#if de
0660: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0670: 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
0680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0690: 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28  LE_SQLLOG).  if(
06a0: 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20   !isPrepareV2 ) 
06b0: 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20  return;.#endif. 
06c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c   assert( p->zSql
06d0: 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c  ==0 );.  p->zSql
06e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
06f0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29  Dup(p->db, z, n)
0700: 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65  ;.  p->isPrepare
0710: 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61  V2 = (u8)isPrepa
0720: 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  reV2;.}../*.** S
0730: 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  wap all content 
0740: 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45  between two VDBE
0750: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
0760: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0770: 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56  Swap(Vdbe *pA, V
0780: 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65  dbe *pB){.  Vdbe
0790: 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63   tmp, *pTmp;.  c
07a0: 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73  har *zTmp;.  ass
07b0: 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d  ert( pA->db==pB-
07c0: 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a  >db );.  tmp = *
07d0: 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b  pA;.  *pA = *pB;
07e0: 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20  .  *pB = tmp;.  
07f0: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74  pTmp = pA->pNext
0800: 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20  ;.  pA->pNext = 
0810: 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d  pB->pNext;.  pB-
0820: 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20  >pNext = pTmp;. 
0830: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65   pTmp = pA->pPre
0840: 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d  v;.  pA->pPrev =
0850: 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42   pB->pPrev;.  pB
0860: 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a  ->pPrev = pTmp;.
0870: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71    zTmp = pA->zSq
0880: 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20  l;.  pA->zSql = 
0890: 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->zSql;.  pB->
08a0: 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 70  zSql = zTmp;.  p
08b0: 42 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d  B->isPrepareV2 =
08c0: 20 70 41 2d 3e 69 73 50 72 65 70 61 72 65 56 32   pA->isPrepareV2
08d0: 3b 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20  ;.  pB->expmask 
08e0: 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 7d  = pA->expmask;.}
08f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
0900: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
0910: 79 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  y so that it is 
0920: 61 74 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65  at least nOp ele
0930: 6d 65 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a  ments larger .**
0940: 20 74 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e   than its curren
0950: 74 20 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67  t size. nOp is g
0960: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
0970: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
0980: 61 6c 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69  al.** to 1024/si
0990: 7a 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20  zeof(Op)..**.** 
09a0: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
09b0: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
09c0: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
09d0: 74 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72  the array, retur
09e0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  n.** SQLITE_NOME
09f0: 4d 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  M. In this case 
0a00: 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72  Vdbe.aOp and Par
0a10: 73 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61  se.nOpAlloc rema
0a20: 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  in .** unchanged
0a30: 20 28 74 68 69 73 20 69 73 20 73 6f 20 74 68 61   (this is so tha
0a40: 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c  t any opcodes al
0a50: 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20  ready allocated 
0a60: 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65  can be .** corre
0a70: 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64  ctly deallocated
0a80: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
0a90: 72 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65  rest of the Vdbe
0aa0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
0ab0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62   growOpArray(Vdb
0ac0: 65 20 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a  e *v, int nOp){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
0af0: 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68  pParse;..  /* Th
0b00: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  e SQLITE_TEST_RE
0b10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d  ALLOC_STRESS com
0b20: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
0b30: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
0b40: 66 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20  force.  ** more 
0b50: 66 72 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63  frequent realloc
0b60: 73 20 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76  s and hence prov
0b70: 69 64 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ide more opportu
0b80: 6e 69 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a  nities for .  **
0b90: 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66   simulated OOM f
0ba0: 61 75 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54  aults.  SQLITE_T
0bb0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
0bc0: 53 53 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20  SS is generally 
0bd0: 75 73 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67  used.  ** during
0be0: 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20   testing only.  
0bf0: 57 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  With SQLITE_TEST
0c00: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0c10: 67 72 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61  grow the op arra
0c20: 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69  y.  ** by the mi
0c30: 6e 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65  nimum* amount re
0c40: 71 75 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65  quired until the
0c50: 20 73 69 7a 65 20 72 65 61 63 68 65 73 20 35 31   size reaches 51
0c60: 32 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  2.  Normal.  ** 
0c70: 6f 70 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f  operation (witho
0c80: 75 74 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ut SQLITE_TEST_R
0c90: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69  EALLOC_STRESS) i
0ca0: 73 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20  s to double the 
0cb0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a  current.  ** siz
0cc0: 65 20 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61  e of the op arra
0cd0: 79 20 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20  y or add 1KB of 
0ce0: 73 70 61 63 65 2c 20 77 68 69 63 68 65 76 65 72  space, whichever
0cf0: 20 69 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a   is smaller. */.
0d00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0d10: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
0d20: 53 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28  S.  int nNew = (
0d30: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32  p->nOpAlloc>=512
0d40: 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   ? p->nOpAlloc*2
0d50: 20 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e   : p->nOpAlloc+n
0d60: 4f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  Op);.#else.  int
0d70: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d80: 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c  lloc ? p->nOpAll
0d90: 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32  oc*2 : (int)(102
0da0: 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a  4/sizeof(Op)));.
0db0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
0dc0: 45 52 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a  ER(nOp);.#endif.
0dd0: 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61  .  /* Ensure tha
0de0: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  t the size of a 
0df0: 56 44 42 45 20 64 6f 65 73 20 6e 6f 74 20 67 72  VDBE does not gr
0e00: 6f 77 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ow too large */.
0e10: 20 20 69 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e    if( nNew > p->
0e20: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
0e30: 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
0e40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
0e50: 6f 6d 46 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a  omFault(p->db);.
0e60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0e70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
0e80: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0e90: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0eb0: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0ec0: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0ed0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0ee0: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0ef0: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0f00: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0f10: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63      p->szOpAlloc
0f20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0f30: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e  ocSize(p->db, pN
0f40: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  ew);.    p->nOpA
0f50: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c  lloc = p->szOpAl
0f60: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a  loc/sizeof(Op);.
0f70: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65      v->aOp = pNe
0f80: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
0f90: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f  (pNew ? SQLITE_O
0fa0: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
0fb0: 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65  _BKPT);.}..#ifde
0fc0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0fd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0fe0: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
0ff0: 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
1000: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 68   a breakpoint th
1010: 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20  at will.** fire 
1020: 61 66 74 65 72 20 65 61 63 68 20 6f 70 63 6f 64  after each opcod
1030: 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e  e is inserted an
1040: 64 20 64 69 73 70 6c 61 79 65 64 20 75 73 69 6e  d displayed usin
1050: 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76 64 62  g.** "PRAGMA vdb
1060: 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22  e_addoptrace=on"
1070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1080: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
1090: 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
10a0: 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20 30  static int n = 0
10b0: 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69  ;.  n++;.}.#endi
10c0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  f../*.** Add a n
10d0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
10e0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
10f0: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
1100: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
1110: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
1120: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1130: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
1140: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
1150: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
1160: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
1170: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
1180: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
1190: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
11a0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
11b0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
11c0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
11d0: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
11e0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
11f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
1200: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
1210: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
1220: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
1230: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
1240: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
1250: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1260: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
1270: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
1280: 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72  _NOINLINE int gr
1290: 6f 77 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  owOp3(Vdbe *p, i
12a0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
12b0: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
12c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
12d0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  rse->nOpAlloc<=p
12e0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
12f0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
1300: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
1310: 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65  ssert( p->pParse
1320: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f  ->nOpAlloc>p->nO
1330: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  p );.  return sq
1340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1350: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1360: 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  3);.}.int sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65  3VdbeAddOp3(Vdbe
1380: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1390: 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74   p1, int p2, int
13a0: 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   p3){.  int i;. 
13b0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20   VdbeOp *pOp;.. 
13c0: 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61   i = p->nOp;.  a
13d0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
13e0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
13f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
1400: 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29  >=0 && op<0xff )
1410: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 72 73  ;.  if( p->pPars
1420: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  e->nOpAlloc<=i )
1430: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
1440: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1450: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1460: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1470: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1480: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1490: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
14a0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
14b0: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
14c0: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
14d0: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
14e0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
14f0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
1500: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1510: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
1520: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
1530: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
1540: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1550: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1560: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1570: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1580: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c  e ){.    int jj,
1590: 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a   kk;.    Parse *
15a0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
15b0: 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b  se;.    for(jj=k
15c0: 6b 3d 30 3b 20 6a 6a 3c 70 50 61 72 73 65 2d 3e  k=0; jj<pParse->
15d0: 6e 43 6f 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b 29  nColCache; jj++)
15e0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 79  {.      struct y
15f0: 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50  ColCache *x = pP
1600: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20  arse->aColCache 
1610: 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 70 72 69 6e  + jj;.      prin
1620: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
1630: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
1640: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
1650: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1670: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
1680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1690: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
16a0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
16b0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
16c0: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
16d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
16e0: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
16f0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
1700: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
1710: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1720: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1730: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d   pOp->iSrcLine =
1740: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
1750: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
1760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
1770: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
1780: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1790: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
17a0: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
17b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
17c0: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
17d0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
17e0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
17f0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1800: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
1810: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1820: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
1830: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1840: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
1850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1860: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1870: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  0);.}../* Genera
1880: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 75  te code for an u
1890: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d  nconditional jum
18a0: 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  p to instruction
18b0: 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71   iDest.*/.int sq
18c0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 56 64  lite3VdbeGoto(Vd
18d0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74  be *p, int iDest
18e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
18f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1900: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65   OP_Goto, 0, iDe
1910: 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65  st, 0);.}../* Ge
1920: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
1930: 61 75 73 65 20 74 68 65 20 73 74 72 69 6e 67 20  ause the string 
1940: 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61 64 65  zStr to be loade
1950: 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74  d into.** regist
1960: 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  er iDest.*/.int 
1970: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1980: 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c 20 69  tring(Vdbe *p, i
1990: 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20  nt iDest, const 
19a0: 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72  char *zStr){.  r
19b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
19c0: 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74  eAddOp4(p, OP_St
19d0: 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2c  ring8, 0, iDest,
19e0: 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a   0, zStr, 0);.}.
19f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a00: 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
1a10: 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20 72  lizes multiple r
1a20: 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 72 69  egisters to stri
1a30: 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a  ng or integer.**
1a40: 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
1a50: 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1a60: 20 77 69 74 68 20 69 44 65 73 74 20 61 6e 64 20   with iDest and 
1a70: 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65 63 75  increase consecu
1a80: 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72  tively..** One r
1a90: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
1aa0: 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63 68 20  alized for each 
1ab0: 63 68 61 72 61 63 67 74 65 72 20 69 6e 20 7a 54  characgter in zT
1ac0: 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63  ypes[].  For eac
1ad0: 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61 63 74  h.** "s" charact
1ae0: 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20  er in zTypes[], 
1af0: 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
1b00: 61 20 73 74 72 69 6e 67 20 69 66 20 74 68 65 20  a string if the 
1b10: 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e  argument is.** n
1b20: 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e  ot NULL, or OP_N
1b30: 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c 75 65  ull if the value
1b40: 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   is a null point
1b50: 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20 22 69  er.  For each "i
1b60: 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  " character.** i
1b70: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20  n zTypes[], the 
1b80: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
1b90: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e  ialized to an in
1ba0: 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  teger..*/.void s
1bb0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
1bc0: 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oad(Vdbe *p, int
1bd0: 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   iDest, const ch
1be0: 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29  ar *zTypes, ...)
1bf0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
1c00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
1c10: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
1c20: 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72  , zTypes);.  for
1c30: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65  (i=0; (c = zType
1c40: 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  s[i])!=0; i++){.
1c50: 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29      if( c=='s' )
1c60: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1c70: 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61  ar *z = va_arg(a
1c80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
1c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ca0: 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30  beAddOp4(p, z==0
1cb0: 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f   ? OP_Null : OP_
1cc0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1cd0: 74 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20  t++, 0, z, 0);. 
1ce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf0: 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29  assert( c=='i' )
1d00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d10: 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f  dbeAddOp2(p, OP_
1d20: 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28  Integer, va_arg(
1d30: 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b  ap, int), iDest+
1d40: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +);.    }.  }.  
1d50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
1d60: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1d70: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1d80: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1d90: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1da0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1db0: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1dd0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1de0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1df0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1e00: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1e10: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e30: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1e40: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1e50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1e60: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1e70: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1e80: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1e90: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1ea0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1eb0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1ec0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1ee0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1ef0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
1f00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1f10: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1f20: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1f30: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1f40: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1f50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1f70: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1f80: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1f90: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
1fa0: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
1fb0: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
1fc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1fd0: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1ff0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
2000: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
2010: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2020: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2030: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2050: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2060: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2070: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2080: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2090: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
20a0: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
20b0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
20c0: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
20d0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
20e0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
20f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
2100: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
2110: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
2120: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2130: 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56 64  cRawNN(sqlite3Vd
2140: 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69  beDb(p), 8);.  i
2150: 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63  f( p4copy ) memc
2160: 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20  py(p4copy, zP4, 
2170: 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  8);.  return sql
2180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
2190: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
21a0: 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65  , p4copy, p4type
21b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
21c0: 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  an OP_ParseSchem
21d0: 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  a opcode.  This 
21e0: 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65  routine is broke
21f0: 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71  n out from.** sq
2200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2210: 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73  ) since it needs
2220: 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74   to also needs t
2230: 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65  o mark all btree
2240: 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62  s.** as having b
2250: 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  een used..**.** 
2260: 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e  The zWhere strin
2270: 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
2280: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2290: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
22a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22b0: 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72   will take owner
22c0: 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ship of the allo
22d0: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  cated memory..*/
22e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
22f0: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
2300: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  p(Vdbe *p, int i
2310: 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65  Db, char *zWhere
2320: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71  ){.  int j;.  sq
2330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2340: 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  p, OP_ParseSchem
2350: 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57  a, iDb, 0, 0, zW
2360: 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  here, P4_DYNAMIC
2370: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
2380: 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29  p->db->nDb; j++)
2390: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
23a0: 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a  Btree(p, j);.}..
23b0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
23c0: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
23d0: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
23e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  s an integer..*/
23f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2400: 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62  AddOp4Int(.  Vdb
2410: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
2420: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
2430: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
2440: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2460: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
2470: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2480: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
2490: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b0: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
24c0: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
24e0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  3 operand */.  i
24f0: 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20  nt p4           
2500: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
2510: 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67  rand as an integ
2520: 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
2530: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2540: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
2550: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69 66  1, p2, p3);.  if
2560: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
2570: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
2580: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70  VdbeOp *pOp = &p
2590: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20  ->aOp[addr];.   
25a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
25b0: 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f 70  4_INT32;.    pOp
25c0: 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20 7d  ->p4.i = p4;.  }
25d0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
25e0: 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  }../* Insert the
25f0: 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75   end of a co-rou
2600: 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tine.*/.void sql
2610: 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
2620: 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  tine(Vdbe *v, in
2630: 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20 73  t regYield){.  s
2640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2650: 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
2660: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
2670: 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
2680: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
2690: 65 72 20 63 61 63 68 65 2c 20 74 68 65 72 65 62  er cache, thereb
26a0: 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  y ensuring that 
26b0: 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75  each.  ** co-rou
26c0: 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77 6e  tine has its own
26d0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 74   independent set
26e0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20 62   of registers, b
26f0: 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e  ecause co-routin
2700: 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65 78  es.  ** might ex
2710: 70 65 63 74 20 74 68 65 69 72 20 72 65 67 69 73  pect their regis
2720: 74 65 72 73 20 74 6f 20 62 65 20 70 72 65 73 65  ters to be prese
2730: 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20 4f  rved across an O
2740: 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a  P_Yield, and.  *
2750: 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61 75  * that could cau
2760: 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20 74  se problems if t
2770: 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f  wo or more co-ro
2780: 75 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e 67  utines are using
2790: 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74   the same.  ** t
27a0: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
27b0: 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61  r..  */.  v->pPa
27c0: 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
27d0: 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e  0;.  v->pParse->
27e0: 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
27f0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2800: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
2810: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
2820: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
2830: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
2840: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
2850: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
2860: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
2870: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
2880: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
2890: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
28a0: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
28b0: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
28c0: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
28d0: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
28e0: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
28f0: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
2900: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
2910: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
2920: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
2930: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
2940: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
2950: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
2960: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
2970: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
2980: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
2990: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
29a0: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
29b0: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
29c0: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
29d0: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
29e0: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
29f0: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
2a00: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
2a10: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
2a20: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
2a30: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  be resolved..**.
2a40: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
2a50: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ned if a malloc(
2a60: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  ) fails..*/.int 
2a70: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2a80: 61 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20  abel(Vdbe *v){. 
2a90: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
2aa0: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d  Parse;.  int i =
2ab0: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
2ac0: 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63  assert( v->magic
2ad0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2ae0: 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20  T );.  if( (i & 
2af0: 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (i-1))==0 ){.   
2b00: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
2b10: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2b20: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
2b30: 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  abel, .         
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
2b60: 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  *2+1)*sizeof(p->
2b70: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d  aLabel[0]));.  }
2b80: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
2b90: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2ba0: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
2bb0: 20 72 65 74 75 72 6e 20 41 44 44 52 28 69 29 3b   return ADDR(i);
2bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2bd0: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2be0: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2bf0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2c00: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2c10: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2c20: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2c30: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2c40: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2c50: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
2c60: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2c70: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2c80: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2c90: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
2ca0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
2cb0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2cc0: 6e 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a  nt j = ADDR(x);.
2cd0: 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67    assert( v->mag
2ce0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2cf0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
2d00: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
2d10: 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 29    assert( j>=0 )
2d20: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
2d30: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
2d40: 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a  el[j] = v->nOp;.
2d50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
2d60: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
2d70: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
2d80: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
2d90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2da0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2db0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
2dc0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
2dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68  }../*.** Mark th
2de0: 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68  e VDBE as one th
2df0: 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72  at can only be r
2e00: 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  un multiple time
2e10: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2e20: 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 56  e3VdbeReusable(V
2e30: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
2e40: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d  nOnlyOnce = 0;.}
2e50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e60: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
2e70: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
2e80: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
2e90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2ea0: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
2eb0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
2ec0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
2ed0: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
2ee0: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
2ef0: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
2f00: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
2f10: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
2f20: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
2f30: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
2f40: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
2f50: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
2f60: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
2f70: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
2f80: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
2f90: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
2fa0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2fb0: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
2fc0: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
2ff0: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
3000: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
3010: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
3020: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
3030: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
3040: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
3050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
3060: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
3070: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
3080: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
3090: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
30a0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
30b0: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
30e0: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
30f0: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
3100: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
3110: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
3120: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
3130: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
3160: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
3170: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
31a0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
31b0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
31c0: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
31d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
31e0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
31f0: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
3200: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
3210: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
3220: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
3230: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
3240: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
3250: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
3260: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
3270: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
3280: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
3290: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
32a0: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
32b0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
32c0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
32d0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
32e0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
32f0: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
3300: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
3310: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
3320: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
3330: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
3340: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
3350: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
3360: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
3370: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
3380: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
3390: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
33a0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
33b0: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
33c0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
33d0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
33e0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
33f0: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
3400: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
3410: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
3420: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
3430: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
3440: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
3450: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
3460: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
3470: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3480: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
3490: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
34a0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
34b0: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
34c0: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
34d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
34e0: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
34f0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
3500: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3510: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
3520: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
3530: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
3540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3550: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
3560: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3570: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
3580: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
3590: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
35a0: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
35b0: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
35c0: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
35d0: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
35e0: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
35f0: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
3600: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
3610: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
3620: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
3630: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
3640: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
3650: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
3660: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
3670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
3680: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
3690: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
36a0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
36b0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
36c0: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
36d0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
36e0: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
36f0: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
3700: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
3710: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
3720: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
3730: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
3740: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
3750: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
3760: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
3770: 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20  traint).**   *  
3780: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 61  OP_CreateTable a
3790: 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  nd OP_InitCorout
37a0: 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 45 20  ine (for CREATE 
37b0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
37c0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
37d0: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
37e0: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
37f0: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
3800: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
3810: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
3820: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3830: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3840: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
3850: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3860: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
3870: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
3880: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
3890: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
38a0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
38b0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
38c0: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
38d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
38e0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
38f0: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
3900: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
3910: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
3920: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
3930: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
3940: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
3950: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
3960: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
3970: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
3980: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
3990: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
39a0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20  InitCoroutine = 
39b0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
39c0: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
39d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  ;.  memset(&sIte
39e0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
39f0: 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20  er));.  sIter.v 
3a00: 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  = v;..  while( (
3a10: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3a20: 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a  (&sIter))!=0 ){.
3a30: 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d      int opcode =
3a40: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
3a50: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3a60: 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f  _Destroy || opco
3a70: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
3a80: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
3a90: 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28 28  name .     || ((
3aa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
3ab0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
3ac0: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
3ad0: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
3ae0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
3af0: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
3b00: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
3b10: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
3b20: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
3b30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3b40: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  if( opcode==OP_C
3b50: 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 61 73  reateTable ) has
3b60: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31 3b  CreateTable = 1;
3b70: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3b80: 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e  =OP_InitCoroutin
3b90: 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f 75  e ) hasInitCorou
3ba0: 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65  tine = 1;.#ifnde
3bb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3bc0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66  REIGN_KEY.    if
3bd0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43  ( opcode==OP_FkC
3be0: 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70  ounter && pOp->p
3bf0: 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d  1==0 && pOp->p2=
3c00: 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73 46  =1 ){.      hasF
3c10: 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20  kCounter = 1;.  
3c20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
3c30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
3c40: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
3c50: 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  b);..  /* Return
3c60: 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72   true if hasAbor
3c70: 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20  t==mayAbort. Or 
3c80: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
3c90: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
3ca0: 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ** If malloc fai
3cb0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68  led, then the wh
3cc0: 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65  ile() loop above
3cd0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74   may not have it
3ce0: 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f  erated.  ** thro
3cf0: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ugh all opcodes 
3d00: 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79  and hasAbort may
3d10: 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63   be set incorrec
3d20: 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a  tly. Return.  **
3d30: 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63   true for this c
3d40: 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ase to prevent t
3d50: 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74  he assert() in t
3d60: 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65  he callers frame
3d70: 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69  .  ** from faili
3d80: 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ng.  */.  return
3d90: 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63   ( v->db->malloc
3da0: 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f  Failed || hasAbo
3db0: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20  rt==mayAbort || 
3dc0: 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20  hasFkCounter.   
3dd0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 68             || (h
3de0: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26 26  asCreateTable &&
3df0: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
3e00: 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e) );.}.#endif /
3e10: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
3e20: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
3e30: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
3e40: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
3e50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3e60: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
3e70: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
3e80: 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49 74  en inserted.  It
3e90: 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75 67   loops.** throug
3ea0: 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65  h all the opcode
3eb0: 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20 73  s and fixes up s
3ec0: 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  ome details..**.
3ed0: 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68 20  ** (1) For each 
3ee0: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
3ef0: 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76 65   with a negative
3f00: 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61 62   P2 value (a lab
3f10: 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f 6c  el).**     resol
3f20: 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ve the P2 value 
3f30: 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64 64  to an actual add
3f40: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20  ress..**.** (2) 
3f50: 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78 69  Compute the maxi
3f60: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
3f70: 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79 20  guments used by 
3f80: 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  any SQL function
3f90: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f 72  .**     and stor
3fa0: 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 20  e that value in 
3fb0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a 2a  *pMaxFuncArgs..*
3fc0: 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65 20  *.** (3) Update 
3fd0: 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e 6c  the Vdbe.readOnl
3fe0: 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52 65  y and Vdbe.bIsRe
3ff0: 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61 63  ader flags to ac
4000: 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  curately.**     
4010: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
4020: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
4030: 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64 6f  ment actually do
4040: 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e  es..**.** (4) In
4050: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34 2e  itialize the p4.
4060: 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72  xAdvance pointer
4070: 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61 74   on opcodes that
4080: 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28   use it..**.** (
4090: 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  5) Reclaim the m
40a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
40b0: 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62 65  for storing labe
40c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ls..**.** This r
40d0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
40e0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63   function correc
40f0: 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70 63  tly if the mkopc
4100: 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74  odeh.tcl generat
4110: 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75 6d  or.** script num
4120: 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65 73  bers the opcodes
4130: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68 61   correctly.  Cha
4140: 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f 75  nges to this rou
4150: 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20  tine must be.** 
4160: 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74 68  coordinated with
4170: 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f 70   changes to mkop
4180: 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74  codeh.tcl..*/.st
4190: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
41a0: 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a  eP2Values(Vdbe *
41b0: 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63  p, int *pMaxFunc
41c0: 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d 61  Args){.  int nMa
41d0: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
41e0: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
41f0: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
4200: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
4210: 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70   int *aLabel = p
4220: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20  Parse->aLabel;. 
4230: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31   p->readOnly = 1
4240: 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72  ;.  p->bIsReader
4250: 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26 70   = 0;.  pOp = &p
4260: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
4270: 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20 20  .  while(1){..  
4280: 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f    /* Only JUMP o
4290: 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20 73  pcodes and the s
42a0: 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70 65  hort list of spe
42b0: 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e 20  cial opcodes in 
42c0: 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20 2a  the switch.    *
42d0: 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f 20  * below need to 
42e0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 20  be considered.  
42f0: 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63  The mkopcodeh.tc
4300: 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72 69  l generator scri
4310: 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a 2a  pt groups.    **
4320: 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f 64   all these opcod
4330: 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61 72  es together near
4340: 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74 68   the front of th
4350: 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20 20  e opcode list.  
4360: 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79 20  Skip.    ** any 
4370: 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65 73  opcode that does
4380: 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65 73   not need proces
4390: 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c 20  sing by virtual 
43a0: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
43b0: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  .    ** it is la
43c0: 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  rger than SQLITE
43d0: 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c  _MX_JUMP_OPCODE,
43e0: 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
43f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
4400: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
4410: 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c 49  Op->opcode<=SQLI
4420: 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44  TE_MX_JUMP_OPCOD
4430: 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f  E ){.      /* NO
4440: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
4450: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
4460: 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67 20  tcl when adding 
4470: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
4480: 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20    ** cases from 
4490: 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a  this switch! */.
44a0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 4f        switch( pO
44b0: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
44c0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
44d0: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
44e0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
44f0: 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e  2!=0 ) p->readOn
4500: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
4510: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
4520: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
4530: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
4540: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20 20  Commit:.        
4550: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
4560: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t: {.          p
4570: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
4580: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e  ;.        }.#ifn
45a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
45b0: 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73 65  WAL.        case
45c0: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a   OP_Checkpoint:.
45d0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63  #endif.        c
45e0: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
45f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a         case OP_J
4600: 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20  ournalMode: {.  
4610: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
4620: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4630: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
4640: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
4650: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4660: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4670: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4680: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4690: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
46a0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
46b0: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
46c0: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
46d0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
46e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
46f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
4700: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ter: {.         
4710: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
4720: 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d    assert( (pOp -
4730: 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b   p->aOp) >= 3 );
4740: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
4750: 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
4760: 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b  e==OP_Integer );
4770: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70  .          n = p
4780: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
4790: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
47a0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
47b0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   n;.          br
47c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
47d0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63 61  endif.        ca
47e0: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
47f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4800: 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 20 20  IfOpen:.        
4810: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
4820: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xt: {.          
4830: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
4840: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
4850: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
4860: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
4870: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
4880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4890: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
48a0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
48b0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
48c0: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
48d0: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
48e0: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
48f0: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20  ePrevious;.     
4900: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
4910: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
4920: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4940: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 71 6c  }.      if( (sql
4950: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
4960: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20  ty[pOp->opcode] 
4970: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30  & OPFLG_JUMP)!=0
4980: 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b   && pOp->p2<0 ){
4990: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
49a0: 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70   ADDR(pOp->p2)<p
49b0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
49c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
49d0: 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70   = aLabel[ADDR(p
49e0: 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20  Op->p2)];.      
49f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4a00: 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72  pOp==p->aOp ) br
4a10: 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a  eak;.    pOp--;.
4a20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
4a30: 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73  ree(p->db, pPars
4a40: 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50  e->aLabel);.  pP
4a50: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  arse->aLabel = 0
4a60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62  ;.  pParse->nLab
4a70: 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46  el = 0;.  *pMaxF
4a80: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
4a90: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  gs;.  assert( p-
4aa0: 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c  >bIsReader!=0 ||
4ab0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
4ac0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
4ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4ae0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
4af0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
4b00: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
4b10: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
4b20: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4b30: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
4b40: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
4b50: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4b60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
4b70: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  Op;.}../*.** Ver
4b80: 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61 73  ify that at leas
4b90: 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73  t N opcode slots
4ba0: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69   are available i
4bb0: 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  n p without.** h
4bc0: 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20  aving to malloc 
4bd0: 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20 28  for more space (
4be0: 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d 70  except when comp
4bf0: 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51  iled using.** SQ
4c00: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
4c10: 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69 73  C_STRESS).  This
4c20: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 73   interface is us
4c30: 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
4c40: 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20 74  g.** to verify t
4c50: 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c 6c  hat certain call
4c60: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
4c70: 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e 20  AddOpList() can 
4c80: 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75  never.** fail du
4c90: 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74  e to a OOM fault
4ca0: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20   and hence that 
4cb0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
4cc0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
4ce0: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 6e  will always be n
4cf0: 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20  on-NULL..*/.#if 
4d00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
4d10: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
4d20: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
4d30: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
4d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
4d50: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
4d60: 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  ired(Vdbe *p, in
4d70: 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
4d80: 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d  p->nOp + N <= p-
4d90: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
4da0: 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  c );.}.#endif../
4db0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
4dc0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
4dd0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
4de0: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ent does not con
4df0: 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65  tain.** an OP_Re
4e00: 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20  sultRow opcode. 
4e10: 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28 29  Fail an assert()
4e20: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68 69   if it does. Thi
4e30: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79 20  s is used.** by 
4e40: 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e 63  code in pragma.c
4e50: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
4e60: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
4e70: 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a  on of certain.**
4e80: 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74   pragmas comport
4e90: 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 73  s with the flags
4ea0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
4eb0: 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74 63  e mkpragmatab.tc
4ec0: 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a  l.** script..*/.
4ed0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4ee0: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
4ef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
4f00: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
4f10: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
4f20: 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
4f30: 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Row(Vdbe *p){.  
4f40: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4f50: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
4f60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
4f70: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
4f80: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a  OP_ResultRow );.
4f90: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
4fa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4fb0: 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
4fc0: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
4fd0: 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f   of opcodes asso
4fe0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
4ff0: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
5000: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5010: 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20  ment. It is the 
5020: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
5030: 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72  bility.** to arr
5040: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74  ange for the ret
5050: 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62  urned array to b
5060: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
5070: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ed using the .**
5080: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
5090: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
50a0: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
50b0: 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65  ing, *pnOp is se
50c0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
50d0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
50e0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72  e returned.** ar
50f0: 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61  ray. Also, *pnMa
5100: 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74  xArg is set to t
5110: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73  he larger of its
5120: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
5130: 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  nd .** the numbe
5140: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
5150: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
5160: 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20   array required 
5170: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a  to execute the .
5180: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67  ** returned prog
5190: 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ram..*/.VdbeOp *
51a0: 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f  sqlite3VdbeTakeO
51b0: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20  pArray(Vdbe *p, 
51c0: 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a  int *pnOp, int *
51d0: 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62  pnMaxArg){.  Vdb
51e0: 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f  eOp *aOp = p->aO
51f0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70  p;.  assert( aOp
5200: 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   && !p->db->mall
5210: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
5220: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c  * Check that sql
5230: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
5240: 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  e() was not call
5250: 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f  ed on this VM */
5260: 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
5270: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
5280: 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73  eMask) );..  res
5290: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
52a0: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
52b0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
52c0: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
52d0: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
52e0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
52f0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
5300: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
5310: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
5320: 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
5330: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
5340: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
5350: 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32  *.** Non-zero P2
5360: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75   arguments to ju
5370: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
5380: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
5390: 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f  y adjusted.** so
53a0: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74   that the jump t
53b0: 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69 76  arget is relativ
53c0: 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f  e to the first o
53d0: 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65  peration inserte
53e0: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
53f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
5400: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  st(.  Vdbe *p,  
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65     /* Add opcode
5430: 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  s to the prepare
5440: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
5450: 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20   int nOp,       
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5470: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64   Number of opcod
5480: 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56  es to add */.  V
5490: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
54a0: 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  *aOp,       /* T
54b0: 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  he opcodes to be
54c0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
54d0: 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20  iLineno         
54e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
54f0: 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d  ce-file line num
5500: 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63  ber of first opc
5510: 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ode */.){.  int 
5520: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75  i;.  VdbeOp *pOu
5530: 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73  t, *pFirst;.  as
5540: 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20  sert( nOp>0 );. 
5550: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5560: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5570: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
5580: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50  Op + nOp > p->pP
5590: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26  arse->nOpAlloc &
55a0: 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  & growOpArray(p,
55b0: 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74   nOp) ){.    ret
55c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69  urn 0;.  }.  pFi
55d0: 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d  rst = pOut = &p-
55e0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20  >aOp[p->nOp];.  
55f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
5600: 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74  i++, aOp++, pOut
5610: 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f  ++){.    pOut->o
5620: 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63  pcode = aOp->opc
5630: 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  ode;.    pOut->p
5640: 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20  1 = aOp->p1;.   
5650: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d   pOut->p2 = aOp-
5660: 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >p2;.    assert(
5670: 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   aOp->p2>=0 );. 
5680: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f     if( (sqlite3O
5690: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f  pcodeProperty[aO
56a0: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
56b0: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61  LG_JUMP)!=0 && a
56c0: 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20  Op->p2>0 ){.    
56d0: 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d    pOut->p2 += p-
56e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
56f0: 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e  pOut->p3 = aOp->
5700: 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  p3;.    pOut->p4
5710: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
5720: 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  D;.    pOut->p4.
5730: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d  p = 0;.    pOut-
5740: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
5750: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
5760: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
5770: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
5780: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
5790: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
57a0: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f  _COVERAGE.    pO
57b0: 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69  ut->iSrcLine = i
57c0: 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a  Lineno+i;.#else.
57d0: 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e      (void)iLinen
57e0: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  o;.#endif.#ifdef
57f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
5800: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
5810: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
5820: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
5830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
5840: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e  rintOp(0, i+p->n
5850: 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d  Op, &p->aOp[i+p-
5860: 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  >nOp]);.    }.#e
5870: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f  ndif.  }.  p->nO
5880: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75  p += nOp;.  retu
5890: 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69  rn pFirst;.}..#i
58a0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
58b0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
58c0: 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41  NSTATUS)./*.** A
58d0: 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
58e0: 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e  he array of coun
58f0: 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20  ters managed by 
5900: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
5910: 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f  nstatus()..*/.vo
5920: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63  id sqlite3VdbeSc
5930: 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65  anStatus(.  Vdbe
5940: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
5960: 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61  M to add scansta
5970: 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e  tus() to */.  in
5980: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20  t addrExplain,  
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
59a0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
59b0: 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
59c0: 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c  .  int addrLoop,
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
59f0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
5a00: 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69   .  int addrVisi
5a10: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5a20: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5a30: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63  f rows visited c
5a40: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45  ounter */.  LogE
5a50: 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20  st nEst,        
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5a70: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
5a80: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
5a90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5aa0: 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  zName           
5ab0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5ac0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65  able or index be
5ad0: 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29  ing scanned */.)
5ae0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
5af0: 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73  (p->nScan+1) * s
5b00: 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73  izeof(ScanStatus
5b10: 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20  );.  ScanStatus 
5b20: 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20  *aNew;.  aNew = 
5b30: 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c  (ScanStatus*)sql
5b40: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
5b50: 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e  >db, p->aScan, n
5b60: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65  Byte);.  if( aNe
5b70: 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61  w ){.    ScanSta
5b80: 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65  tus *pNew = &aNe
5b90: 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20  w[p->nScan++];. 
5ba0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70     pNew->addrExp
5bb0: 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61  lain = addrExpla
5bc0: 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  in;.    pNew->ad
5bd0: 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f  drLoop = addrLoo
5be0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  p;.    pNew->add
5bf0: 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69 73  rVisit = addrVis
5c00: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45  it;.    pNew->nE
5c10: 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  st = nEst;.    p
5c20: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  New->zName = sql
5c30: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e  ite3DbStrDup(p->
5c40: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
5c50: 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b  p->aScan = aNew;
5c60: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
5c70: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5c80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70   value of the op
5c90: 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c  code, or P1, P2,
5ca0: 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61   P3, or P5 opera
5cb0: 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65  nds.** for a spe
5cc0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
5cd0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5ce0: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
5cf0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  de(Vdbe *p, u32 
5d00: 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63  addr, u8 iNewOpc
5d10: 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ode){.  sqlite3V
5d20: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
5d30: 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f  ->opcode = iNewO
5d40: 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71  pcode;.}.void sq
5d50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5d60: 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  1(Vdbe *p, u32 a
5d70: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
5d80: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
5d90: 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20  p(p,addr)->p1 = 
5da0: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
5db0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
5dc0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5dd0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
5de0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5df0: 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61  p,addr)->p2 = va
5e00: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
5e10: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
5e20: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
5e30: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
5e40: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
5e50: 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b  addr)->p3 = val;
5e60: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5e70: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
5e80: 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20   *p, u16 p5){.  
5e90: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5ea0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
5eb0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
5ec0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61   p->nOp>0 ) p->a
5ed0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
5ee0: 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = p5;.}../*.** C
5ef0: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
5f00: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
5f10: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
5f20: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
5f30: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
5f40: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
5f50: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
5f60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5f70: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
5f80: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
5f90: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
5fa0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
5fb0: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
5fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
5fd0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
5fe0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
5ff0: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
6000: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
6010: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
6020: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
6030: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
6040: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
6050: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
6060: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
6070: 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65  Def){.  if( (pDe
6080: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
6090: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
60a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
60b0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
60c0: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pDef);.  }.}..st
60d0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
60e0: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
60f0: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
6100: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
6110: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
6120: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
6130: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
6140: 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d  E void freeP4Mem
6150: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65  (sqlite3 *db, Me
6160: 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  m *p){.  if( p->
6170: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
6180: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
6190: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69  zMalloc);.  sqli
61a0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
61b0: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c  p);.}.static SQL
61c0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
61d0: 64 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28  d freeP4FuncCtx(
61e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c  sqlite3 *db, sql
61f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29  ite3_context *p)
6200: 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72 61  {.  freeEphemera
6210: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d  lFunction(db, p-
6220: 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65  >pFunc);. sqlite
6230: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
6240: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
6250: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a  freeP4(sqlite3 *
6260: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20  db, int p4type, 
6270: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73  void *p4){.  ass
6280: 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69  ert( db );.  swi
6290: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
62a0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43     case P4_FUNCC
62b0: 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65  TX: {.      free
62c0: 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73  P4FuncCtx(db, (s
62d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
62e0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
62f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6300: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61   P4_REAL:.    ca
6310: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
6320: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
6330: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  :.    case P4_IN
6340: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
6350: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6360: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , p4);.      bre
6370: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6380: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6390: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70  .      if( db->p
63a0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
63b0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
63c0: 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70  nref((KeyInfo*)p
63d0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
63e0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
63f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
6400: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
6410: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
6420: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6430: 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29  lete(db, (Expr*)
6440: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
6450: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6460: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
6470: 45 46 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65  EF: {.      free
6480: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
6490: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
64a0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
64b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
64c0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
64d0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
64e0: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
64f0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
6500: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
6510: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
6520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
6530: 72 65 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65  reeP4Mem(db, (Me
6540: 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a  m*)p4);.      }.
6550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6560: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56   }.    case P4_V
6570: 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66  TAB : {.      if
6580: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
6590: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
65a0: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
65b0: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  e *)p4);.      b
65c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
65d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
65e0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
65f0: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
6600: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
6610: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
6620: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
6630: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
6640: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
6650: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
6660: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
6670: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
6680: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
6690: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
66a0: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
66b0: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
66c0: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
66d0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61  ;.    for(pOp=&a
66e0: 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d  Op[nOp-1]; pOp>=
66f0: 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20  aOp; pOp--){.   
6700: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
6710: 70 65 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  pe ) freeP4(db, 
6720: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
6730: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
6740: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
6750: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
6760: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6770: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
6780: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
6790: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c    .    }.    sql
67a0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
67b0: 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   aOp);.  }.}../*
67c0: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
67d0: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
67e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
67f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
6800: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
6810: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
6820: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
6830: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
6840: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
6850: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
6860: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
6870: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
6880: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
6890: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
68a0: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
68b0: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
68c0: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
68d0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
68e0: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
68f0: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
6900: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
6910: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
6920: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73  OP_Noop.*/.int s
6930: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6940: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
6950: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62  int addr){.  Vdb
6960: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
6970: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6980: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
6990: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
69a0: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
69b0: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e   );.  pOp = &p->
69c0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
69d0: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
69e0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
69f0: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70  p);.  pOp->p4typ
6a00: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
6a10: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b    pOp->p4.z = 0;
6a20: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
6a30: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75   OP_Noop;.  retu
6a40: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
6a50: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
6a60: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
6a70: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
6a80: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
6a90: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
6aa0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
6ab0: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
6ac0: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
6ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6ae0: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
6af0: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
6b00: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  8 op){.  if( p->
6b10: 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b  nOp>0 && p->aOp[
6b20: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
6b30: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ==op ){.    retu
6b40: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  rn sqlite3VdbeCh
6b50: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
6b60: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  >nOp-1);.  }else
6b70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6b80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
6b90: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6ba0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
6bb0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
6bc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
6bd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6be0: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
6bf0: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
6c00: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
6c10: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
6c20: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
6c30: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
6c40: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
6c50: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
6c60: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
6c70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
6c80: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
6c90: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
6ca0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
6cb0: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
6cc0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
6cd0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
6ce0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
6cf0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
6d00: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
6d10: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
6d20: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
6d30: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
6d40: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
6d50: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
6d60: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
6d70: 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  P4..** .** Other
6d80: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
6d90: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
6da0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
6db0: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
6dc0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
6dd0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
6de0: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
6df0: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
6e00: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
6e10: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
6e20: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
6e30: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
6e40: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
6e50: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
6e60: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
6e70: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
6e80: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
6e90: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
6ea0: 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  d SQLITE_NOINLIN
6eb0: 45 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75  E vdbeChangeP4Fu
6ec0: 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20  ll(.  Vdbe *p,. 
6ed0: 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73   Op *pOp,.  cons
6ee0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69  t char *zP4,.  i
6ef0: 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f  nt n.){.  if( pO
6f00: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
6f10: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
6f20: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
6f30: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d  >p4.p);.    pOp-
6f40: 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  >p4type = 0;.   
6f50: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
6f60: 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b    }.  if( n<0 ){
6f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f80: 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74  ChangeP4(p, (int
6f90: 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c  )(pOp - p->aOp),
6fa0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73   zP4, n);.  }els
6fb0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
6fc0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
6fd0: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
6fe0: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
6ff0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
7000: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
7010: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
7020: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
7030: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7040: 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a  eChangeP4(Vdbe *
7050: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
7060: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e  st char *zP4, in
7070: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
7080: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7090: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
70a0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
70b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
70c0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
70d0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
70e0: 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62   p->aOp!=0 || db
70f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7100: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
7110: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7120: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
7130: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
7140: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
7150: 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  zP4);.    return
7160: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7170: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
7180: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
7190: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
71a0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
71b0: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
71c0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
71d0: 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d  addr];.  if( n>=
71e0: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65  0 || pOp->p4type
71f0: 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e   ){.    vdbeChan
7200: 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c  geP4Full(p, pOp,
7210: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65   zP4, n);.    re
7220: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
7230: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
7240: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
7250: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
7260: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
7270: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
7280: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
7290: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
72a0: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
72b0: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
72c0: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
72d0: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
72e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
72f0: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
7300: 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20   if( zP4!=0 ){. 
7310: 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29     assert( n<0 )
7320: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
7330: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
7340: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7350: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
7360: 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54      if( n==P4_VT
7370: 41 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  AB ) sqlite3Vtab
7380: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50  Lock((VTable*)zP
7390: 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  4);.  }.}../*.**
73a0: 20 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 6f   Change the P4 o
73b0: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f  perand of the mo
73c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
73d0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a  d instruction .*
73e0: 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 64  * to the value d
73f0: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 61 72  efined by the ar
7400: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69  guments.  This i
7410: 73 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  s a high-speed.*
7420: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  * version of sql
7430: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
7440: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  ()..**.** The P4
7450: 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f   operand must no
7460: 74 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76  t have been prev
7470: 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e 20  iously defined. 
7480: 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20   And the new.** 
7490: 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 50  P4 must not be P
74a0: 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73 71  4_INT32.  Use sq
74b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
74c0: 34 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f 66  4() in either of
74d0: 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73 2e  .** those cases.
74e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
74f0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 56 64 62  VdbeAppendP4(Vdb
7500: 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c  e *p, void *pP4,
7510: 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f   int n){.  VdbeO
7520: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
7530: 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26 26  ( n!=P4_INT32 &&
7540: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20   n!=P4_VTAB );. 
7550: 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b   assert( n<=0 );
7560: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
7570: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7580: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
7590: 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65  n, pP4);.  }else
75a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
75b0: 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  4!=0 );.    asse
75c0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
75d0: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
75e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20  p[p->nOp-1];.   
75f0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
7600: 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44  type==P4_NOTUSED
7610: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   );.    pOp->p4t
7620: 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70  ype = n;.    pOp
7630: 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20  ->p4.p = pP4;.  
7640: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
7650: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
7660: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
7670: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
7680: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
7690: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
76a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
76b0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
76c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
76d0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
76e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
76f0: 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f  pVdbe;.  KeyInfo
7700: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73   *pKeyInfo;.  as
7710: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
7720: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
7730: 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  );.  pKeyInfo = 
7740: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
7750: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
7760: 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  dx);.  if( pKeyI
7770: 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62  nfo ) sqlite3Vdb
7780: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
7790: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
77a0: 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  O);.}..#ifdef SQ
77b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
77c0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
77d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
77e0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  mment on the mos
77f0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
7800: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
7810: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
7820: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
7830: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
7840: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
7850: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
7860: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
7870: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
7880: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
7890: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
78a0: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
78b0: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
78c0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
78d0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
78e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
78f0: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
7900: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
7910: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
7920: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7930: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
7940: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
7950: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
7960: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7970: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
7980: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
7990: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
79a0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
79b0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
79c0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
79d0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
79e0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
79f0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
7a00: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
7a10: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
7a20: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
7a30: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
7a40: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
7a50: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
7a60: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7a70: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
7a80: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
7a90: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
7aa0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
7ab0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
7ac0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7ad0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
7ae0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
7af0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
7b00: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
7b10: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
7b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
7b30: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
7b40: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
7b50: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
7b60: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
7b70: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
7b80: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
7b90: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
7ba0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
7bb0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
7bc0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
7bd0: 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63  alue if the iSrc
7be0: 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74  Line field for t
7bf0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  he previously co
7c00: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
7c10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c20: 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65  VdbeSetLineNumbe
7c30: 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  r(Vdbe *v, int i
7c40: 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Line){.  sqlite3
7c50: 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d  VdbeGetOp(v,-1)-
7c60: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
7c70: 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
7c80: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
7c90: 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AGE */../*.** Re
7ca0: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
7cb0: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
7cc0: 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64  ess.  If the add
7cd0: 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e  ress is -1, then
7ce0: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d  .** return the m
7cf0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
7d00: 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  erted opcode..**
7d10: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
7d20: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7d30: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72   has occurred pr
7d40: 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69  ior to the calli
7d50: 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f  ng of this.** ro
7d60: 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f  utine, then a po
7d70: 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79  inter to a dummy
7d80: 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20   VdbeOp will be 
7d90: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20  returned.  That 
7da0: 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61  opcode.** is rea
7db0: 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72  dable but not wr
7dc0: 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69  itable, though i
7dd0: 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77  t is cast to a w
7de0: 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a  ritable value..*
7df0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20  * The return of 
7e00: 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61  a dummy opcode a
7e10: 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74  llows the call t
7e20: 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74  o continue funct
7e30: 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20  ioning.** after 
7e40: 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74  an OOM fault wit
7e50: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
7e60: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
7e70: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
7e80: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7e90: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
7ea0: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
7eb0: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
7ec0: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
7ed0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
7ee0: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
7ef0: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
7f00: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
7f10: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
7f20: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
7f30: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
7f40: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
7f50: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
7f60: 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66  .  /* C89 specif
7f70: 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ies that the con
7f80: 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69  stant "dummy" wi
7f90: 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
7fa0: 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65  d to all.  ** ze
7fb0: 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f  ros, which is co
7fc0: 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e  rrect.  MSVC gen
7fd0: 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67  erates a warning
7fe0: 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20  , nevertheless. 
7ff0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65  */.  static Vdbe
8000: 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67  Op dummy;  /* Ig
8010: 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61  nore the MSVC wa
8020: 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69  rning about no i
8030: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20  nitializer */.  
8040: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
8050: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
8060: 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  T );.  if( addr<
8070: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
8080: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
8090: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
80a0: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
80b0: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
80c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
80d0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
80e0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
80f0: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
8100: 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ummy;.  }else{. 
8110: 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f     return &p->aO
8120: 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a  p[addr];.  }.}..
8130: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8140: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
8150: 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a  N_COMMENTS)./*.*
8160: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
8170: 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e  ger value for on
8180: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
8190: 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64  ers to the opcod
81a0: 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69  e pOp.** determi
81b0: 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72  ned by character
81c0: 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c..*/.static in
81d0: 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61  t translateP(cha
81e0: 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70  r c, const Op *p
81f0: 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31  Op){.  if( c=='1
8200: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
8210: 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27  p1;.  if( c=='2'
8220: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
8230: 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20  2;.  if( c=='3' 
8240: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33  ) return pOp->p3
8250: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29  ;.  if( c=='4' )
8260: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e   return pOp->p4.
8270: 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d  i;.  return pOp-
8280: 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  >p5;.}../*.** Co
8290: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66  mpute a string f
82a0: 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22  or the "comment"
82b0: 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45   field of a VDBE
82c0: 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e   opcode listing.
82d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70  .**.** The Synop
82e0: 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f  sis: field in co
82f0: 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64  mments in the vd
8300: 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65  be.c source file
8310: 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a   gets converted.
8320: 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73  ** to an extra s
8330: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70  tring that is ap
8340: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71  pended to the sq
8350: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8360: 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62  ).  In the.** ab
8370: 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63  sence of other c
8380: 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79  omments, this sy
8390: 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74  nopsis becomes t
83a0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
83b0: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d  e opcode..** Som
83c0: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63  e translation oc
83d0: 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  curs:.**.**     
83e0: 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20    "PX"      ->  
83f0: 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20  "r[X]".**       
8400: 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72  "PX@PY"   ->  "r
8410: 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20  [X..X+Y-1]"  or 
8420: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
8430: 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22   or 1.**       "
8440: 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b  PX@PY+1" ->  "r[
8450: 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22  X..X+Y]"    or "
8460: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a  r[x]" if y is 0.
8470: 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59  **       "PY..PY
8480: 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22  "  ->  "r[X..Y]"
8490: 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20        or "r[x]" 
84a0: 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69  if y<=x.*/.stati
84b0: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d  c int displayCom
84c0: 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70  ment(.  const Op
84d0: 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68   *pOp,     /* Th
84e0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63  e opcode to be c
84f0: 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f  ommented */.  co
8500: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
8510: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f   /* Previously o
8520: 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f  btained value fo
8530: 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a  r P4 */.  char *
8540: 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20  zTemp,       /* 
8550: 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72  Write result her
8560: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70  e */.  int nTemp
8570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
8580: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ce available in 
8590: 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  zTemp[] */.){.  
85a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e  const char *zOpN
85b0: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
85c0: 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20  r *zSynopsis;.  
85d0: 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69  int nOpName;.  i
85e0: 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61  nt ii, jj;.  cha
85f0: 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f  r zAlt[50];.  zO
8600: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  pName = sqlite3O
8610: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8620: 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d  pcode);.  nOpNam
8630: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
8640: 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20  n30(zOpName);.  
8650: 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e  if( zOpName[nOpN
8660: 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e  ame+1] ){.    in
8670: 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20  t seenCom = 0;. 
8680: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a     char c;.    z
8690: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61  Synopsis = zOpNa
86a0: 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20  me += nOpName + 
86b0: 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  1;.    if( strnc
86c0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46  mp(zSynopsis,"IF
86d0: 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20   ",3)==0 ){.    
86e0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
86f0: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
8700: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8710: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
8720: 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22  f(zAlt), zAlt, "
8730: 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a  r[P2] = (%s)", z
8740: 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20  Synopsis+3);.   
8750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8760: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8770: 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c  tf(sizeof(zAlt),
8780: 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67 6f   zAlt, "if %s go
8790: 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69  to P2", zSynopsi
87a0: 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s+3);.      }.  
87b0: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
87c0: 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zAlt;.    }.    
87d0: 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c  for(ii=jj=0; jj<
87e0: 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20  nTemp-1 && (c = 
87f0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d  zSynopsis[ii])!=
8800: 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  0; ii++){.      
8810: 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20  if( c=='P' ){.  
8820: 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70        c = zSynop
8830: 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20  sis[++ii];.     
8840: 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b     if( c=='4' ){
8850: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8860: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8870: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8880: 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20  "%s", zP4);.    
8890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
88a0: 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='X' ){.        
88b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
88c0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
88d0: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70  mp+jj, "%s", pOp
88e0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
88f0: 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d         seenCom =
8900: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
8910: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
8920: 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v1 = translateP
8930: 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  (c, pOp);.      
8940: 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20      int v2;.    
8950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8960: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
8970: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c   zTemp+jj, "%d",
8980: 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   v1);.          
8990: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
89a0: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22  opsis+ii+1, "@P"
89b0: 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 2)==0 ){.     
89c0: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a         ii += 3;.
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b              jj +
89e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
89f0: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
8a00: 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72           v2 = tr
8a10: 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73  anslateP(zSynops
8a20: 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20  is[ii], pOp);.  
8a30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
8a40: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
8a50: 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20  ii+1,"+1",2)==0 
8a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8a70: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   ii += 2;.      
8a80: 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20          v2++;.  
8a90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8aa0: 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31          if( v2>1
8ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ac0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8ad0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
8ae0: 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76  mp+jj, "..%d", v
8af0: 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20  1+v2-1);.       
8b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b10: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
8b20: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8b30: 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30  1, "..P3", 4)==0
8b40: 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29   && pOp->p3==0 )
8b50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
8b60: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
8b70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8b80: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
8b90: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
8ba0: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +jj);.      }els
8bb0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  e{.        zTemp
8bc0: 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  [jj++] = c;.    
8bd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8be0: 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a  ( !seenCom && jj
8bf0: 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d  <nTemp-5 && pOp-
8c00: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
8c10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8c20: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8c30: 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20  emp+jj, "; %s", 
8c40: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
8c50: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
8c60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
8c70: 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p+jj);.    }.   
8c80: 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20   if( jj<nTemp ) 
8c90: 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20  zTemp[jj] = 0;. 
8ca0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
8cb0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
8cc0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8cd0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8ce0: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
8cf0: 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71  nt);.    jj = sq
8d00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
8d10: 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  emp);.  }else{. 
8d20: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
8d30: 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d  .    jj = 0;.  }
8d40: 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a  .  return jj;.}.
8d50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8d60: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56  _DEBUG */..#if V
8d70: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
8d80: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8d90: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8da0: 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  INTS)./*.** Tran
8db0: 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78  slate the P4.pEx
8dc0: 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20  pr value for an 
8dd0: 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70  OP_CursorHint op
8de0: 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a  code into text.*
8df0: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69  * that can be di
8e00: 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50  splayed in the P
8e10: 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c  4 column of EXPL
8e20: 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73  AIN output..*/.s
8e30: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
8e40: 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63 75  ayP4Expr(StrAccu
8e50: 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70  m *p, Expr *pExp
8e60: 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
8e70: 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69   *zOp = 0;.  swi
8e80: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8e90: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  {.    case TK_ST
8ea0: 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69  RING:.      sqli
8eb0: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
8ec0: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
8ed0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
8ee0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8ef0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71  NTEGER:.      sq
8f00: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8f10: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
8f20: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
8f30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f40: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c  _NULL:.      sql
8f50: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8f60: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72  NULL");.      br
8f70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f80: 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
8f90: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8fa0: 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45  f(p, "r[%d]", pE
8fb0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
8fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8fd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
8fe0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
8ff0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
9000: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
9010: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
9020: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
9030: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9040: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9050: 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70  "c%d", (int)pExp
9060: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
9070: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9090: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70   TK_LT:      zOp
90a0: 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72   = "LT";      br
90b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
90c0: 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LE:      zOp = 
90d0: 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LE";      break
90e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
90f0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54  :      zOp = "GT
9100: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9110: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20     case TK_GE:  
9120: 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20      zOp = "GE"; 
9130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9140: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
9150: 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20   zOp = "NE";    
9160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9170: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f  e TK_EQ:      zO
9180: 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62  p = "EQ";      b
9190: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
91a0: 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_IS:      zOp =
91b0: 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65 61   "IS";      brea
91c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
91d0: 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49  SNOT:   zOp = "I
91e0: 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SNOT";   break;.
91f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
9200: 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22       zOp = "AND"
9210: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9220: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
9230: 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20    zOp = "OR";   
9240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9250: 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a  se TK_PLUS:    z
9260: 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20  Op = "ADD";     
9270: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9280: 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20  TK_STAR:    zOp 
9290: 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65  = "MUL";     bre
92a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
92b0: 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  MINUS:   zOp = "
92c0: 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  SUB";     break;
92d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
92e0: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d  :     zOp = "REM
92f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9300: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
9310: 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44  :  zOp = "BITAND
9320: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
9330: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
9340: 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20  zOp = "BITOR";  
9350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9360: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70   TK_SLASH:   zOp
9370: 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62 72   = "DIV";     br
9380: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9390: 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _LSHIFT:  zOp = 
93a0: 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "LSHIFT";  break
93b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
93c0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53  HIFT:  zOp = "RS
93d0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
93e0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
93f0: 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41  T:  zOp = "CONCA
9400: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
9410: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
9420: 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20   zOp = "MINUS"; 
9430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9440: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f  e TK_UPLUS:   zO
9450: 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62  p = "PLUS";    b
9460: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9470: 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d  K_BITNOT:  zOp =
9480: 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61   "BITNOT";  brea
9490: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
94a0: 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e  OT:     zOp = "N
94b0: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
94c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
94d0: 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55  LL:  zOp = "ISNU
94e0: 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  LL";  break;.   
94f0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
9500: 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c  : zOp = "NOTNULL
9510: 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64  "; break;..    d
9520: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71  efault:.      sq
9530: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9540: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
9550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9560: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
9570: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9580: 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b  (p, "%s(", zOp);
9590: 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78  .    displayP4Ex
95a0: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pr(p, pExpr->pLe
95b0: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ft);.    if( pEx
95c0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
95d0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
95e0: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c 22  cumAppend(p, ","
95f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73 70  , 1);.      disp
9600: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
9610: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9620: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74   }.    sqlite3St
9630: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20  rAccumAppend(p, 
9640: 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23  ")", 1);.  }.}.#
9650: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
9660: 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69  SPLAY_P4 && defi
9670: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9680: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20  E_CURSOR_HINTS) 
9690: 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49  */...#if VDBE_DI
96a0: 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43  SPLAY_P4./*.** C
96b0: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
96c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
96d0: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
96e0: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
96f0: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
9700: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
9710: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
9720: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
9730: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
9740: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
9750: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
9760: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
9770: 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d  Temp;.  StrAccum
9780: 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54   x;.  assert( nT
9790: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c  emp>=20 );.  sql
97a0: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
97b0: 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e  (&x, 0, zTemp, n
97c0: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74  Temp, 0);.  swit
97d0: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
97e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
97f0: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
9800: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79  int j;.      Key
9810: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
9820: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
9830: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
9840: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
9850: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
9860: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9870: 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65  (&x, "k(%d", pKe
9880: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a  yInfo->nField);.
9890: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
98a0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
98b0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
98c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
98d0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
98e0: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f  l[j];.        co
98f0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
9900: 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d  = pColl ? pColl-
9910: 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20  >zName : "";.   
9920: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
9930: 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29  zColl, "BINARY")
9940: 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42  ==0 ) zColl = "B
9950: 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ";.        sqlit
9960: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c  e3XPrintf(&x, ",
9970: 25 73 25 73 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  %s%s", pKeyInfo-
9980: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f  >aSortOrder[j] ?
9990: 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c   "-" : "", zColl
99a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
99b0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
99c0: 41 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c 20  Append(&x, ")", 
99d0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
99e0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
99f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9a00: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
9a10: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
9a20: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
9a30: 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78  (&x, pOp->p4.pEx
9a40: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
9a50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9a60: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
9a70: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
9a80: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
9a90: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
9aa0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9ab0: 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20  (&x, "(%.20s)", 
9ac0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
9ad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9ae0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
9af0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
9b00: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
9b10: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
9b20: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9b30: 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  tf(&x, "%s(%d)",
9b40: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
9b50: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
9b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
9b70: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9b80: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
9b90: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
9ba0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
9bb0: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75  CCTX: {.      Fu
9bc0: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
9bd0: 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e  p->p4.pCtx->pFun
9be0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
9bf0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28  XPrintf(&x, "%s(
9c00: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9c10: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
9c40: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
9c50: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9c60: 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ntf(&x, "%lld", 
9c70: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
9c80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c90: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
9ca0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
9cb0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9cc0: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
9cd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9ce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
9cf0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
9d00: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9d10: 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  x, "%.16g", *pOp
9d20: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
9d30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d40: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
9d50: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
9d60: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
9d70: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
9d80: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
9d90: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
9da0: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
9db0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
9dc0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
9dd0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
9de0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9df0: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
9e00: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
9e10: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
9e20: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
9e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
9e40: 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67  rintf(&x, "%.16g
9e50: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20  ", pMem->u.r);. 
9e60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
9e70: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9e80: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Null ){.       
9e90: 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20   zP4 = "NULL";. 
9ea0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9eb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
9ec0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
9ed0: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
9ee0: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
9ef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
9f00: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
9f10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9f20: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
9f30: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
9f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
9f50: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
9f60: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
9f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9f80: 69 6e 74 66 28 26 78 2c 20 22 76 74 61 62 3a 25  intf(&x, "vtab:%
9f90: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
9fa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9fb0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
9fc0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
9fd0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
9fe0: 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e   int *ai = pOp->
9ff0: 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74  p4.ai;.      int
a000: 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a   n = ai[0];   /*
a010: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
a020: 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41  nt of an INTARRA
a030: 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a  Y is always the.
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20         ** count 
a060: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a070: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c   elements to fol
a080: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  low */.      for
a090: 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=1; i<n; i++){
a0a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a0b0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 64  XPrintf(&x, ",%d
a0c0: 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20  ", ai[i]);.     
a0d0: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   }.      zTemp[0
a0e0: 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73  ] = '[';.      s
a0f0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
a100: 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31 29  pend(&x, "]", 1)
a110: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a120: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
a130: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
a140: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
a150: 6e 74 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d  ntf(&x, "program
a160: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
a170: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a180: 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20  P4_ADVANCE: {.  
a190: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
a1a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a1b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
a1c0: 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  _TABLE: {.      
a1d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
a1e0: 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  x, "%s", pOp->p4
a1f0: 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pTab->zName);. 
a200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a210: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
a220: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
a230: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
a240: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
a250: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
a260: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
a270: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
a280: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a290: 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
a2a0: 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (&x);.  assert( 
a2b0: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
a2c0: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
a2d0: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
a2e0: 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  _P4 */../*.** De
a2f0: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
a300: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
a310: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
a320: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
a330: 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65  *.** The prepare
a340: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65  d statements nee
a350: 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76  d to know in adv
a360: 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  ance the complet
a370: 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61  e set of.** atta
a380: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
a390: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e  hat will be use.
a3a0: 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73    A mask of thes
a3b0: 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69  e databases.** i
a3c0: 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20  s maintained in 
a3d0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54  p->btreeMask.  T
a3e0: 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76  he p->lockMask v
a3f0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73  alue is the subs
a400: 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65  et of.** p->btre
a410: 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73  eMask of databas
a420: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71  es that will req
a430: 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a  uire a lock..*/.
a440: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a450: 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a  UsesBtree(Vdbe *
a460: 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73  p, int i){.  ass
a470: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
a480: 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28  ->db->nDb && i<(
a490: 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61  int)sizeof(yDbMa
a4a0: 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72  sk)*8 );.  asser
a4b0: 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  t( i<(int)sizeof
a4c0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38  (p->btreeMask)*8
a4d0: 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28   );.  DbMaskSet(
a4e0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29  p->btreeMask, i)
a4f0: 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20  ;.  if( i!=1 && 
a500: 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
a510: 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b  able(p->db->aDb[
a520: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44  i].pBt) ){.    D
a530: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b  bMaskSet(p->lock
a540: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  Mask, i);.  }.}.
a550: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a560: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a570: 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66  _CACHE)./*.** If
a580: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
a590: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
a5a0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
a5b0: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
a5c0: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
a5d0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
a5e0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
a5f0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
a600: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
a610: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
a620: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
a630: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
a640: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
a650: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
a660: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
a670: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
a680: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
a690: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
a6a0: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
a6b0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
a6c0: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
a6d0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
a6e0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
a6f0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
a700: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
a710: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
a720: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
a730: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
a740: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
a750: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
a760: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
a770: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
a780: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
a790: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
a7a0: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
a7b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
a7c0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
a7d0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
a7e0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
a7f0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
a800: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
a810: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
a820: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
a830: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
a840: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
a850: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
a860: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
a870: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
a880: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
a890: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
a8a0: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
a8b0: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
a8c0: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
a8d0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
a8e0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
a8f0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
a900: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
a910: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
a920: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a930: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
a940: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
a950: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
a960: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
a970: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
a980: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
a990: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
a9a0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
a9b0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
a9c0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44  int nDb;.  if( D
a9d0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
a9e0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
a9f0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
aa00: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
aa10: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
aa20: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
aa30: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
aa40: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
aa50: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
aa60: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
aa70: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
aa80: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
aa90: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
aaa0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
aab0: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
aac0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
aad0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
aae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
aaf0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
ab00: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
ab10: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c  /*.** Unlock all
ab20: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70   of the btrees p
ab30: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64  reviously locked
ab40: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
ab50: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29  lite3VdbeEnter()
ab60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
ab70: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
ab80: 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20   vdbeLeave(Vdbe 
ab90: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
aba0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
abb0: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
abc0: 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
abd0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
abe0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
abf0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
ac00: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
ac10: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
ac20: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
ac30: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
ac40: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
ac50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ac60: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
ac70: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
ac80: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
ac90: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
aca0: 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  {.  if( DbMaskAl
acb0: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
acc0: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
acd0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
ace0: 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28   */.  vdbeLeave(
acf0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  p);.}.#endif..#i
ad00: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
ad10: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
ad20: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
ad30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
ad40: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
ad50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
ad60: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
ad70: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
ad80: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
ad90: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
ada0: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
adb0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
adc0: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
add0: 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b   char zCom[100];
ade0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
adf0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
ae00: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
ae10: 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e  %4d %4d %-13s %.
ae20: 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  2X %s\n";.  if( 
ae30: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
ae40: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d   stdout;.  zP4 =
ae50: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
ae60: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
ae70: 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  r));.#ifdef SQLI
ae80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
ae90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73  N_COMMENTS.  dis
aea0: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
aeb0: 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65   zP4, zCom, size
aec0: 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65  of(zCom));.#else
aed0: 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a  .  zCom[0] = 0;.
aee0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20  #endif.  /* NB: 
aef0: 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   The sqlite3Opco
af00: 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f  deName() functio
af10: 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
af20: 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64   by code created
af30: 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f  .  ** by the mko
af40: 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d  pcodeh.awk and m
af50: 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72  kopcodec.awk scr
af60: 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61  ipts which extra
af70: 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f  ct the.  ** info
af80: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
af90: 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74   vdbe.c source t
afa0: 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ext */.  fprintf
afb0: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
afc0: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
afd0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
afe0: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
aff0: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
b000: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
b010: 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a  >p5,.      zCom.
b020: 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f    );.  fflush(pO
b030: 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
b040: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b050: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
b060: 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  m element..*/.st
b070: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65  atic void initMe
b080: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
b090: 6e 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64  nt N, sqlite3 *d
b0a0: 62 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20  b, u16 flags){. 
b0b0: 20 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20   while( (N--)>0 
b0c0: 29 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  ){.    p->db = d
b0d0: 62 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  b;.    p->flags 
b0e0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e  = flags;.    p->
b0f0: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69  szMalloc = 0;.#i
b100: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
b110: 47 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46  G.    p->pScopyF
b120: 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
b130: 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a      p++;.  }.}..
b140: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
b150: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
b160: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
b170: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
b180: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
b190: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
b1a0: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
b1b0: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
b1c0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
b1d0: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
b1e0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
b1f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20   ){.      do{.  
b200: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
b210: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
b220: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
b230: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68  lloc);.      }wh
b240: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
b250: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
b260: 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
b270: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
b280: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
b290: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
b2a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b2b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
b2c0: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29  MemInvariants(p)
b2d0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   );..      /* Th
b2e0: 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c  is block is real
b2f0: 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65  ly an inlined ve
b300: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
b310: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29  VdbeMemRelease()
b320: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
b330: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f  akes advantage o
b340: 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  f the fact that 
b350: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
b360: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20  value is .      
b370: 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  ** being set to 
b380: 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61  NULL after relea
b390: 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63  sing any dynamic
b3a0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
b3b0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
b3c0: 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  e justification 
b3d0: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20  for duplicating 
b3e0: 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63  code is that acc
b3f0: 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20  ording to .     
b400: 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74   ** callgrind, t
b410: 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72  his causes a cer
b420: 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74  tain test case t
b430: 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e  o hit the CPU 4.
b440: 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63  7 .      ** perc
b450: 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69  ent less (x86 li
b460: 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e  nux, gcc version
b470: 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61   4.1.2, -O6) tha
b480: 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73  n if .      ** s
b490: 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65  qlite3MemRelease
b4a0: 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66  () were called f
b4b0: 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d  rom here. With -
b4c0: 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20  O2, this jumps. 
b4d0: 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70       ** to 6.6 p
b4e0: 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74  ercent. The test
b4f0: 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69   case is inserti
b500: 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74  ng 1000 rows int
b510: 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20  o a table .     
b520: 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65   ** with no inde
b530: 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67  xes using a sing
b540: 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45  le prepared INSE
b550: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  RT statement, bi
b560: 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61  nd() .      ** a
b570: 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65  nd reset(). Inse
b580: 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  rts are grouped 
b590: 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69  into a transacti
b5a0: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
b5b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
b5c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20  flags & MEM_Agg 
b5d0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b5e0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
b5f0: 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74  M_Dyn );.      t
b600: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
b610: 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b  s & MEM_Frame );
b620: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b630: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
b640: 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20  RowSet );.      
b650: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
b660: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
b670: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
b680: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
b690: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
b6a0: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
b6b0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61  else if( p->szMa
b6c0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
b6d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
b6e0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
b6f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61  .        p->szMa
b700: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
b710: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
b720: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
b730: 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  d;.    }while( (
b740: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  ++p)<pEnd );.  }
b750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
b760: 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a   a VdbeFrame obj
b770: 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  ect and its cont
b780: 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20  ents. VdbeFrame 
b790: 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61  objects are.** a
b7a0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
b7b0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
b7c0: 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65  e in sqlite3Vdbe
b7d0: 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Exec()..*/.void 
b7e0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
b7f0: 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65  Delete(VdbeFrame
b800: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
b810: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62   Mem *aMem = Vdb
b820: 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20  eFrameMem(p);.  
b830: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43  VdbeCursor **apC
b840: 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
b850: 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68   **)&aMem[p->nCh
b860: 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69  ildMem];.  for(i
b870: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
b880: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
b890: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
b8a0: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
b8b0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
b8c0: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
b8d0: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
b8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
b8f0: 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d  eteAuxData(p->v-
b900: 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
b910: 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c  a, -1, 0);.  sql
b920: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
b930: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
b940: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b950: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
b960: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
b970: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
b980: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
b990: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
b9a0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
b9b0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
b9c0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
b9d0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
b9e0: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
b9f0: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
ba00: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
ba10: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
ba20: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
ba30: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
ba40: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
ba50: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
ba60: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
ba70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
ba80: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
ba90: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
baa0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
bab0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
bac0: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
bad0: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
bae0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
baf0: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
bb00: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
bb10: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
bb20: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
bb30: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
bb40: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
bb50: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
bb60: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
bb70: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
bb80: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
bb90: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
bba0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
bbb0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
bbc0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
bbf0: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
bc20: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
bc30: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
bc40: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bc70: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
bc80: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
bc90: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
bca0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
bcb0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
bcc0: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
bcd0: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
bd00: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
bd10: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
bd20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
bd30: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
bd40: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
bd50: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
bd60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bd90: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
bda0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bdb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bdc0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
bdd0: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
bde0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
be00: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
be10: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
be20: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
be30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
be40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
be50: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
be60: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
be70: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
be80: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
be90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bea0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
beb0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
bec0: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
bed0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
bee0: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
bef0: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
bf00: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
bf10: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
bf20: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
bf30: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
bf40: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
bf50: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
bf60: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
bf70: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
bf80: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
bf90: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
bfa0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
bfb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bfc0: 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20  _BKPT ){.    /* 
bfd0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
bfe0: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
bff0: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
c000: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
c010: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
c020: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
c030: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
c040: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
c050: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
c060: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c070: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
c080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
c090: 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68  utput rows reach
c0a0: 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65  es nRow, that me
c0b0: 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  ans the.  ** lis
c0c0: 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  ting has finishe
c0d0: 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74  d and sqlite3_st
c0e0: 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75  ep() should retu
c0f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
c100: 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65    ** nRow is the
c110: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
c120: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
c130: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  e main program, 
c140: 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75  plus.  ** the su
c150: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
c160: 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74  of rows in all t
c170: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
c180: 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  ms encountered. 
c190: 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65   ** so far.  The
c1a0: 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c   nRow value will
c1b0: 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77   increase as new
c1c0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
c1d0: 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e  rams are.  ** en
c1e0: 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70  countered, but p
c1f0: 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75  ->pc will eventu
c200: 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f  ally catch up to
c210: 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52   nRow..  */.  nR
c220: 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  ow = p->nOp;.  i
c230: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
c240: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
c250: 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65  irst 8 memory ce
c260: 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  lls are used for
c270: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c280: 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20    So we will.   
c290: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74   ** commandeer t
c2a0: 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75  he 9th cell to u
c2b0: 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f  se as storage fo
c2c0: 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  r an array of po
c2d0: 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f  inters.    ** to
c2e0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
c2f0: 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20  rams.  The VDBE 
c300: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
c310: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39   have at least 9
c320: 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20  .    ** cells.  
c330: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
c340: 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20  ->nMem>9 );.    
c350: 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pSub = &p->aMem[
c360: 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  9];.    if( pSub
c370: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
c380: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20   ){.      /* On 
c390: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
c3a0: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
c3b0: 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64  , pSub will hold
c3c0: 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a   a NULL.  It is.
c3d0: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
c3e0: 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62  ized to a BLOB b
c3f0: 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47  y the P4_SUBPROG
c400: 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  RAM processing l
c410: 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ogic below */.  
c420: 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d      nSub = pSub-
c430: 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29  >n/sizeof(Vdbe*)
c440: 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20  ;.      apSub = 
c450: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
c460: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20  Sub->z;.    }.  
c470: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
c480: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  b; i++){.      n
c490: 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d  Row += apSub[i]-
c4a0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >nOp;.    }.  }.
c4b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
c4c0: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
c4d0: 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65  ( i<nRow && p->e
c4e0: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
c4f0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
c500: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
c510: 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20  f( i>=nRow ){.  
c520: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c530: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
c540: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
c550: 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  se if( db->u1.is
c560: 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20  Interrupted ){. 
c570: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
c580: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
c590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
c5a0: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OR;.    sqlite3V
c5b0: 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69  dbeError(p, sqli
c5c0: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
c5d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c5e0: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f  char *zP4;.    O
c5f0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20  p *pOp;.    if( 
c600: 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  i<p->nOp ){.    
c610: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
c620: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73  line number is s
c630: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74  mall enough that
c640: 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e   we are still in
c650: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61   the.      ** ma
c660: 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  in program. */. 
c670: 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61       pOp = &p->a
c680: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  Op[i];.    }else
c690: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72  {.      /* We ar
c6a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74  e currently list
c6b0: 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ing subprograms.
c6c0: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
c6d0: 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20  ch one and.     
c6e0: 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20   ** pick up the 
c6f0: 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f  appropriate opco
c700: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  de. */.      int
c710: 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70   j;.      i -= p
c720: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72  ->nOp;.      for
c730: 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a  (j=0; i>=apSub[j
c740: 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20  ]->nOp; j++){.  
c750: 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62        i -= apSub
c760: 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  [j]->nOp;.      
c770: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
c780: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
c790: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c7a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
c7b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c7c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
c7d0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
c7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
c810: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
c820: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
c830: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c840: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
c850: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
c860: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
c870: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
c880: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
c890: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
c8a0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
c8b0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
c8c0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
c8d0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
c8e0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
c8f0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c900: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
c910: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
c920: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
c930: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
c940: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
c950: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
c960: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
c970: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
c980: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
c990: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
c9a0: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
c9b0: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
c9c0: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
c9d0: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
c9e0: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
c9f0: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
ca00: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
ca10: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
ca20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ca30: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
ca40: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
ca50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
ca60: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
ca70: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
ca80: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
ca90: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
caa0: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
cab0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
cac0: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
cad0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
cae0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
caf0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
cb00: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
cb10: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
cb20: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e  w(pSub, nByte, n
cb30: 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Sub!=0) ){.     
cb40: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
cb50: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
cb60: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ->z;.          a
cb70: 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70  pSub[nSub++] = p
cb80: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  Op->p4.pProgram;
cb90: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
cba0: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c  >flags |= MEM_Bl
cbb0: 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ob;.          pS
cbc0: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
cbd0: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
cbe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cbf0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
cc00: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
cc10: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
cc20: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
cc50: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
cc60: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
cc70: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
cc80: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
cc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
ccb0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
ccc0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
ccd0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
cce0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
ccf0: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd10: 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P3 */.    pMem+
cd20: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +;..    if( sqli
cd30: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
cd40: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31  ndResize(pMem, 1
cd50: 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a  00) ){ /* P4 */.
cd60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cd70: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
cd80: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
cd90: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
cda0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
cdb0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
cdc0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50  MEM_Term;.    zP
cdd0: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
cde0: 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d  p, pMem->z, pMem
cdf0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  ->szMalloc);.   
ce00: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
ce10: 7a 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  z ){.      pMem-
ce20: 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  >n = 0;.      sq
ce30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
ce40: 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31  tr(pMem, zP4, -1
ce50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
ce60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ce70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
ce80: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
ce90: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
cea0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
ceb0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
cec0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
ced0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
cee0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
cef0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
cf00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
cf10: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
cf20: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29  esize(pMem, 4) )
cf30: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
cf40: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
cf50: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
cf60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
cf70: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
cf80: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
cf90: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
cfa0: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
cfb0: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  n = 2;.      sql
cfc0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
cfd0: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
cfe0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
cff0: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P5 */.      pMe
d000: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
d010: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
d020: 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51  ++;.  .#ifdef SQ
d030: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
d040: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
d050: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
d060: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
d070: 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29  ize(pMem, 500) )
d080: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d090: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
d0a0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
d0b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
d0c0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
d0d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
d0e0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
d0f0: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
d100: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
d110: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
d120: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
d130: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
d140: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65  LITE_UTF8;.#else
d150: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
d160: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
d190: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  */.#endif.    }.
d1a0: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
d1b0: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
d1c0: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
d1d0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
d1e0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
d1f0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d200: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
d210: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
d220: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
d230: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d240: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
d250: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d260: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
d270: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
d280: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
d290: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
d2a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
d2b0: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
d2c0: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
d2d0: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
d2e0: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
d2f0: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
d300: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
d310: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
d320: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
d330: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
d340: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
d350: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
d360: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
d370: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
d380: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
d390: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
d3a0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
d3b0: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
d3c0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
d3d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
d3e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d3f0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
d400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
d410: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
d420: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
d430: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
d440: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
d450: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d460: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
d470: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
d480: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
d490: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
d4a0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
d4b0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
d4c0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
d4d0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
d4e0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
d4f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
d500: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
d510: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
d520: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
d530: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
d540: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
d550: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
d560: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
d570: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
d580: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
d590: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
d5a0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
d5b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d5c0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
d5d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
d5e0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
d5f0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
d600: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
d610: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d620: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
d630: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
d640: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
d650: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
d660: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
d670: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
d680: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
d690: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
d6a0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
d6b0: 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
d6c0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
d6d0: 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d  describes bulk m
d6e0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
d6f0: 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75  for use.** by su
d700: 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61  bcomponents of a
d710: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
d720: 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61  ent.  Space is a
d730: 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20  llocated out.** 
d740: 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61  of a ReusableSpa
d750: 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65  ce object by the
d760: 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f   allocSpace() ro
d770: 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  utine below..*/.
d780: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
d790: 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70  pace {.  u8 *pSp
d7a0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ace;          /*
d7b0: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
d7c0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  y */.  int nFree
d7d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
d7e0: 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
d7f0: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  e memory */.  in
d800: 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20  t nNeeded;      
d810: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65     /* Total byte
d820: 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74  s that could not
d830: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f   be allocated */
d840: 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61  .};../* Try to a
d850: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
d860: 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  tes of 8-byte al
d870: 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72  igned bulk memor
d880: 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72  y for pBuf.** fr
d890: 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  om the ReusableS
d8a0: 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65  pace object.  Re
d8b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
d8c0: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a  o the allocated.
d8d0: 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63  ** memory on suc
d8e0: 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66  cess.  If insuff
d8f0: 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73  icient memory is
d900: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
d910: 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61  e.** ReusableSpa
d920: 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65  ce object, incre
d930: 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65  ase the Reusable
d940: 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a  Space.nNeeded.**
d950: 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d   value by the am
d960: 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20  ount needed and 
d970: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
d980: 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  ** If pBuf is no
d990: 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  t initially NULL
d9a0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
d9b0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73  t the memory has
d9c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
d9d0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20   allocated by a 
d9e0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
d9f0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a  is routine, so j
da00: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70  ust return a cop
da10: 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64  y.** of pBuf and
da20: 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53   leave ReusableS
da30: 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  pace unchanged..
da40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63  **.** This alloc
da50: 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64  ator is employed
da60: 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e   to repurpose un
da70: 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68  used slots at th
da80: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
da90: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20  opcode array of 
daa0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66  prepared state f
dab0: 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20  or other memory 
dac0: 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65  needs of the pre
dad0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
dae0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
daf0: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
db00: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
db10: 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42  eSpace *p,  /* B
db20: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
db30: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
db40: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
db50: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
db60: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
db70: 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74   a prior allocat
db80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ion */.  int nBy
db90: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
dba0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d     /* Bytes of m
dbb0: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
dbc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
dbd0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
dbe0: 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a  T(p->pSpace) );.
dbf0: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
dc00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
dc10: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
dc20: 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e  if( nByte <= p->
dc30: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  nFree ){.      p
dc40: 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65  ->nFree -= nByte
dc50: 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
dc60: 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72  p->pSpace[p->nFr
dc70: 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ee];.    }else{.
dc80: 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64        p->nNeeded
dc90: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
dca0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
dcb0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
dcc0: 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72  ENT(pBuf) );.  r
dcd0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
dce0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
dcf0: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
dd00: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
dd10: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
dd20: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
dd30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
dd40: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
dd50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
dd60: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
dd70: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
dd80: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
dd90: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
dda0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ddb0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
ddc0: 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e  AGIC_INIT || p->
ddd0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
dde0: 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a  C_RESET );..  /*
ddf0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
de00: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
de10: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
de20: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
de30: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
de40: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
de50: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
de60: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
de70: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
de80: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
de90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
dea0: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
deb0: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
dec0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
ded0: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
dee0: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
def0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
df00: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
df10: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
df20: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
df30: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
df40: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
df50: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
df60: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
df70: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
df80: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
df90: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
dfa0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
dfb0: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
dfc0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
dfd0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
dfe0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
dff0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
e000: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
e010: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
e020: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
e030: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
e040: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
e050: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
e060: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
e070: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
e080: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
e090: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
e0a0: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
e0b0: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
e0c0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
e0d0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
e0e0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
e0f0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
e100: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
e110: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
e120: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
e130: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
e140: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
e150: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
e160: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
e170: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
e180: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
e190: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e1a0: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
e1b0: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
e1c0: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
e1d0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
e1e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e1f0: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
e200: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
e210: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
e220: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
e230: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
e240: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
e250: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
e260: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
e270: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
e280: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
e290: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
e2a0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
e2b0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
e2c0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
e2d0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
e2e0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
e2f0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
e300: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
e310: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
e320: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
e330: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
e340: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
e350: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
e360: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
e370: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
e380: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
e3b0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
e3c0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
e3d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e3e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
e3f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e410: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
e420: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
e430: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e450: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
e460: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
e470: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
e480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e490: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
e4a0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
e4b0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
e4e0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
e4f0: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e520: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
e530: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
e540: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
e550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e560: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
e570: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
e580: 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f  pace x;        /
e590: 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20  * Reusable bulk 
e5a0: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73  memory */..  ass
e5b0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
e5c0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
e5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e5e0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
e5f0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
e600: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
e610: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
e620: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
e630: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
e640: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
e650: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
e660: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
e670: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
e680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
e690: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
e6a0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
e6b0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
e6c0: 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75  .  .  /* Each cu
e6d0: 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f  rsor uses a memo
e6e0: 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69  ry cell.  The fi
e6f0: 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73  rst cursor (curs
e700: 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75  or 0) can.  ** u
e710: 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68  se aMem[0] which
e720: 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
e730: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  e used by the VD
e740: 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c  BE program.  All
e750: 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
e760: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
e770: 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72  Mem[] for cursor
e780: 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e  s 1 and greater.
e790: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
e7a0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
e7b0: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
e7c0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20   nCursor;.  if( 
e7d0: 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d  nCursor==0 && nM
e7e0: 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20  em>0 ) nMem++;  
e7f0: 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65  /* Space for aMe
e800: 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74  m[0] even if not
e810: 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46   used */..  /* F
e820: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
e830: 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f  ch reusable memo
e840: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
e850: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e860: 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72  e.  ** opcode ar
e870: 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61  ray.  This extra
e880: 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
e890: 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  reallocated for 
e8a0: 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20  other elements. 
e8b0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61   ** of the prepa
e8c0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
e8d0: 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38   */.  n = ROUND8
e8e0: 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e  (sizeof(Op)*p->n
e8f0: 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  Op);            
e900: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70    /* Bytes of op
e910: 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64  code memory used
e920: 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d   */.  x.pSpace =
e930: 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b   &((u8*)p->aOp)[
e940: 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  n];             
e950: 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f    /* Unused opco
e960: 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  de memory */.  a
e970: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
e980: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53  E_ALIGNMENT(x.pS
e990: 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72  pace) );.  x.nFr
e9a0: 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  ee = ROUNDDOWN8(
e9b0: 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f  pParse->szOpAllo
e9c0: 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65  c - n);  /* Byte
e9d0: 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f  s of unused memo
e9e0: 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ry */.  assert( 
e9f0: 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  x.nFree>=0 );.  
ea00: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
ea10: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e  TE_ALIGNMENT(&x.
ea20: 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29  pSpace[x.nFree])
ea30: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
ea40: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
ea50: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
ea60: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
ea70: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
ea80: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
ea90: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
eaa0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
eab0: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
eac0: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
ead0: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
eae0: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
eaf0: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
eb00: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
eb10: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
eb20: 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77  ted in one or tw
eb30: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
eb40: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
eb50: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
eb60: 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79  se unused memory
eb70: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
eb80: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
eb90: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
eba0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
ebb0: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
ebc0: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
ebd0: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
ebe0: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
ebf0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
ec00: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
ec10: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
ec20: 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20  mainder using a 
ec30: 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c  fresh memory all
ec40: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
ec50: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
ec60: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
ec70: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
ec80: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
ec90: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
eca0: 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79   leftover memory
ecb0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ecc0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
ecd0: 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69    This can signi
ece0: 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
ecf0: 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
ed00: 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
ed10: 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
ed20: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
ed30: 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65  o {.    x.nNeede
ed40: 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  d = 0;.    p->aM
ed50: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
ed60: 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  &x, p->aMem, nMe
ed70: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
ed80: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
ed90: 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
eda0: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
edb0: 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e  f(Mem));.    p->
edc0: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
edd0: 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c  ce(&x, p->apArg,
ede0: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
edf0: 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  *));.    p->apCs
ee00: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
ee10: 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  x, p->apCsr, nCu
ee20: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
ee30: 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
ee40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ee50: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
ee60: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
ee70: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
ee80: 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
ee90: 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
eea0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 78 2e  endif.    if( x.
eeb0: 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20 62 72 65  nNeeded==0 ) bre
eec0: 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61 63 65  ak;.    x.pSpace
eed0: 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71   = p->pFree = sq
eee0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
eef0: 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64  NN(db, x.nNeeded
ef00: 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d  );.    x.nFree =
ef10: 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77   x.nNeeded;.  }w
ef20: 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  hile( !db->mallo
ef30: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
ef40: 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65  >pVList = pParse
ef50: 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72  ->pVList;.  pPar
ef60: 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b  se->pVList =  0;
ef70: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
ef80: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
ef90: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
efa0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
efb0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20  ->nVar = 0;.    
efc0: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a  p->nCursor = 0;.
efd0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b      p->nMem = 0;
efe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
eff0: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
f000: 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20  or;.    p->nVar 
f010: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
f020: 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
f030: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64  p->aVar, nVar, d
f040: 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
f050: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
f060: 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72  ;.    initMemArr
f070: 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ay(p->aMem, nMem
f080: 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69  , db, MEM_Undefi
f090: 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ned);.    memset
f0a0: 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43  (p->apCsr, 0, nC
f0b0: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
f0c0: 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
f0d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f0e0: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
f0f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61  .    memset(p->a
f100: 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70  nExec, 0, p->nOp
f110: 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
f120: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
f130: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
f140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f150: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
f160: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
f170: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
f180: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
f190: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
f1a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f1b0: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
f1c0: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
f1d0: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
f1e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
f1f0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
f200: 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c   pCx->pBtx==0 ||
f210: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d   pCx->eCurType==
f220: 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
f230: 0a 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e  .  switch( pCx->
f240: 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20  eCurType ){.    
f250: 63 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52  case CURTYPE_SOR
f260: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
f270: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
f280: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
f290: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f2a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52    }.    case CUR
f2b0: 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20  TYPE_BTREE: {.  
f2c0: 20 20 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45      if( pCx->isE
f2d0: 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
f2e0: 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74      if( pCx->pBt
f2f0: 78 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65  x ) sqlite3Btree
f300: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29  Close(pCx->pBtx)
f310: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
f320: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
f330: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
f340: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
f350: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
f360: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
f370: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  above. */.      
f380: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
f390: 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70  ssert( pCx->uc.p
f3a0: 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
f3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f3c0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
f3d0: 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
f3e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f3f0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
f400: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f410: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
f420: 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42  ase CURTYPE_VTAB
f430: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f440: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
f450: 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70  VCur = pCx->uc.p
f460: 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73  VCur;.      cons
f470: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
f480: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75   *pModule = pVCu
f490: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
f4a0: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
f4b0: 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
f4c0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  Ref>0 );.      p
f4d0: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
f4e0: 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75  f--;.      pModu
f4f0: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72  le->xClose(pVCur
f500: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f510: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f530: 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74  all cursors in t
f540: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
f550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f560: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
f570: 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  rame(Vdbe *p){. 
f580: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
f590: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
f5a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
f5b0: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
f5c0: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
f5d0: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
f5e0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
f5f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f600: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
f610: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
f620: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
f630: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f640: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  }.}../*.** Copy 
f650: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
f660: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
f670: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
f680: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
f690: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
f6a0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
f6b0: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
f6c0: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
f6d0: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
f6e0: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
f6f0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
f700: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
f710: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
f720: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
f730: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
f740: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
f750: 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64  InFrame(v);.#ifd
f760: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f770: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
f780: 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
f790: 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23  Frame->anExec;.#
f7a0: 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d  endif.  v->aOp =
f7b0: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
f7c0: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
f7d0: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
f7e0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
f7f0: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
f800: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
f810: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
f820: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
f830: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
f840: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
f850: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
f860: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
f870: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
f880: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
f890: 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
f8a0: 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
f8b0: 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ge;.  sqlite3Vdb
f8c0: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 76  eDeleteAuxData(v
f8d0: 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61  ->db, &v->pAuxDa
f8e0: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d  ta, -1, 0);.  v-
f8f0: 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46 72 61  >pAuxData = pFra
f900: 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  me->pAuxData;.  
f910: 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
f920: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
f930: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
f940: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
f950: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
f960: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
f970: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
f980: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
f990: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
f9a0: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
f9b0: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
f9c0: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
f9d0: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
f9e0: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
f9f0: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
fa00: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
fa10: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
fa20: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
fa30: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
fa40: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
fa50: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
fa60: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
fa70: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
fa80: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
fa90: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
faa0: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
fab0: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
fac0: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
fad0: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
fae0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
faf0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
fb00: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
fb10: 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65  0;.    p->nFrame
fb20: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
fb30: 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30  rt( p->nFrame==0
fb40: 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f   );.  closeCurso
fb50: 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20  rsInFrame(p);.  
fb60: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
fb70: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
fb80: 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e  ay(p->aMem, p->n
fb90: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
fba0: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
fbb0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
fbc0: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
fbd0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
fbe0: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
fbf0: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
fc00: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
fc10: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
fc20: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
fc30: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
fc40: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
fc50: 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
fc60: 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
fc70: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
fc80: 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41  ta(p->db, &p->pA
fc90: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
fca0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
fcb0: 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
fcc0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
fcd0: 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e  e VM after a sin
fce0: 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74  gle run..*/.stat
fcf0: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
fd00: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
fd10: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
fd20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fd30: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
fd40: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
fd50: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
fd60: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
fd70: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
fd80: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
fd90: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
fda0: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
fdb0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
fdc0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
fdd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
fde0: 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
fdf0: 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
fe00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
fe10: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
fe20: 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
fe30: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
fe40: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
fe50: 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20  M_Undefined );. 
fe60: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
fe70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
fe80: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
fe90: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
fea0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
feb0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
fec0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
fed0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
fee0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
fef0: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
ff00: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
ff10: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
ff20: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
ff30: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
ff40: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
ff50: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
ff60: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
ff70: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
ff80: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
ff90: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
ffa0: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
ffb0: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
ffc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ffd0: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
ffe0: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
fff0: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
10000 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
10010 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10020 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ->db;..  release
10030 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
10040 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
10050 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
10060 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10070 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
10080 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  ;.  n = nResColu
10090 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
100a0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
100b0 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b  (u16)nResColumn;
100c0 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
100d0 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
100e0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
100f0 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
10100 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
10110 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
10120 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69   ) return;.  ini
10130 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  tMemArray(p->aCo
10140 6c 4e 61 6d 65 2c 20 6e 2c 20 70 2d 3e 64 62 2c  lName, n, p->db,
10150 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f   MEM_Null);.}../
10160 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
10170 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
10180 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
10190 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
101a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
101b0 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
101c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
101d0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
101e0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
101f0 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
10200 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
10210 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
10220 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  mCols()..**.** T
10230 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
10240 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62  er, xDel, must b
10250 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
10260 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f  DYNAMIC, SQLITE_
10270 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c  STATIC.** or SQL
10280 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49  ITE_TRANSIENT. I
10290 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44  f it is SQLITE_D
102a0 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65  YNAMIC, then the
102b0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
102c0 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77  ** to by zName w
102d0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
102e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20  sqlite3DbFree() 
102f0 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
10300 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69   destroyed..*/.i
10310 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
10320 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65  tColName(.  Vdbe
10330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10350 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69  Vdbe being confi
10360 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  gured */.  int i
10370 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
10380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10390 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a  ndex of column z
103a0 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  Name applies to 
103b0 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20  */.  int var,   
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
103e0 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f  the COLNAME_* co
103f0 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  nstants */.  con
10400 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10420 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
10430 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61  er containing na
10440 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  me */.  void (*x
10450 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20  Del)(void*)     
10460 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
10470 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74  ry management st
10480 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65  rategy for zName
10490 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
104a0 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
104b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
104c0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
104d0 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
104e0 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
104f0 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
10500 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
10510 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78  ert( !zName || x
10520 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del!=SQLITE_DYNA
10530 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  MIC );.    retur
10540 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
10550 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
10560 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
10570 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
10580 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
10590 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
105a0 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
105b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
105c0 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
105d0 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
105e0 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
105f0 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
10600 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
10610 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
10620 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
10630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10640 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
10650 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
10660 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
10670 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
10680 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
10690 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
106a0 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
106b0 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
106c0 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
106d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
106e0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
106f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
10700 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10710 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
10720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10730 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
10740 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
10750 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
10760 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
10770 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
10780 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
10790 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
107a0 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
107b0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63     ** that are c
107e0 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20  andidates for a 
107f0 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
10800 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20   using a.       
10810 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
10820 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  aster-journal */
10830 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10840 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
10850 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
10860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10870 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10880 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
10890 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
108a0 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
108b0 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
108c0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
108d0 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
108e0 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
108f0 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
10900 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
10910 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
10920 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
10930 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
10940 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
10950 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
10960 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
10970 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
10980 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
10990 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
109a0 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
109b0 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
109c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
109d0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
109e0 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
109f0 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
10a00 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
10a10 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
10a20 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
10a30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10a40 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
10a50 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
10a60 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
10a70 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
10a80 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
10a90 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
10aa0 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
10ab0 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
10ac0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
10ad0 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
10ae0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
10af0 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
10b00 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
10b10 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
10b20 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
10b30 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
10b40 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
10b50 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
10b60 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
10b70 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
10b80 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
10b90 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
10ba0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
10bb0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
10bc0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10bd0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10be0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10bf0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10c00 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
10c10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ){.      /* Whet
10c20 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74  her or not a dat
10c30 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64  abase might need
10c40 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10c50 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20  l depends upon. 
10c60 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72       ** its jour
10c70 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20  nal mode (among 
10c80 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20  other things).  
10c90 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65  This matrix dete
10ca0 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20  rmines which.   
10cb0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f     ** journal mo
10cc0 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72  des use a master
10cd0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69   journal and whi
10ce0 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20  ch do not */.   
10cf0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
10d00 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d  u8 aMJNeeded[] =
10d10 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45   {.        /* DE
10d20 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20  LETE   */  1,.  
10d30 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54        /* PERSIST
10d40 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20     */ 1,.       
10d50 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f   /* OFF       */
10d60 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   0,.        /* T
10d70 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20  RUNCATE  */ 1,. 
10d80 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59         /* MEMORY
10d90 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
10da0 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a    /* WAL       *
10db0 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  / 0.      };.   
10dc0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
10dd0 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73  ;   /* Pager ass
10de0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74  ociated with pBt
10df0 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63   */.      needXc
10e00 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10e20 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  er(pBt);.      p
10e30 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
10e40 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
10e50 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
10e60 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[i].safety_leve
10e70 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l!=PAGER_SYNCHRO
10e80 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20  NOUS_OFF.       
10e90 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c  && aMJNeeded[sql
10ea0 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72  ite3PagerGetJour
10eb0 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d  nalMode(pPager)]
10ec0 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20  .      ){ .     
10ed0 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20     assert( i!=1 
10ee0 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e  );.        nTran
10ef0 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s++;.      }.   
10f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10f10 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
10f20 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
10f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10f40 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ve(pBt);.    }. 
10f50 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
10f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10f70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10f80 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10f90 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
10fa0 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
10fb0 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
10fc0 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
10fd0 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
10fe0 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
10ff0 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
11000 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
11010 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
11020 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
11030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11040 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11050 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
11060 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
11070 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
11080 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
11090 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
110a0 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
110b0 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
110c0 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
110d0 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
110e0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
110f0 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
11100 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
11110 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
11120 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
11130 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11140 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
11150 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
11160 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
11170 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
11180 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
11190 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
111a0 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
111b0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
111c0 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
111d0 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
111e0 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
111f0 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
11200 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
11210 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
11220 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
11230 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
11240 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
11250 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
11260 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
11270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
11280 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
11290 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
112a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
112b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
112c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
112d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
112e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
112f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11300 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
11310 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
11320 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
11330 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
11340 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
11350 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
11360 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
11370 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
11380 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
11390 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
113a0 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
113b0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
113c0 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
113d0 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
113e0 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
113f0 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
11400 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
11410 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
11420 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
11430 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
11440 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11450 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11460 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11470 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11480 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11490 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
114a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
114b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
114c0 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
114d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
114e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
114f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11500 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
11510 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
11520 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
11530 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
11540 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
11550 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
11560 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
11570 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
11580 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11590 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
115a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
115b0 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
115c0 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  ically..  */.#if
115d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
115e0 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
115f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
11600 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
11610 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
11620 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
11630 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
11640 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
11650 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
11660 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
11670 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11680 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
11690 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
116a0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
116b0 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
116c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
116d0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
116e0 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
116f0 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
11700 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
11710 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11720 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
11730 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
11740 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11750 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
11760 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
11770 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
11780 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
11790 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
117a0 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
117b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
117c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f  MEM_BKPT;.    do
117d0 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
117e0 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
117f0 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
11800 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
11810 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
11820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
11830 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
11840 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
11850 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11860 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
11870 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11880 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
11890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
118a0 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
118b0 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
118c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
118d0 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
118e0 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
118f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11900 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11910 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
11920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
11930 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
11940 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
11950 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
11960 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
11970 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
11980 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
11990 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
119c0 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
119d0 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
119e0 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
119f0 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
11a00 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
11a10 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
11a20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
11a30 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
11a40 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
11a50 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
11a60 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
11a70 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
11a80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
11a90 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
11aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
11ab0 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
11ac0 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
11ad0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11ae0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
11af0 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
11b00 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
11b10 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
11b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11b30 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
11b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11b50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
11b60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11b70 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
11b80 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
11b90 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
11ba0 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
11bb0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
11bc0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11bd0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
11be0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
11bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11c00 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
11c10 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
11c20 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
11c30 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
11c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11c50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11c60 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11c70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11c80 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
11c90 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
11ca0 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
11cb0 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
11cc0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
11cd0 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
11ce0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
11cf0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11d00 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
11d10 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
11d20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11d30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11d40 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
11d50 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
11d60 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
11d70 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
11d80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11d90 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
11da0 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
11db0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
11dc0 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
11dd0 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
11de0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11df0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
11e00 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
11e10 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11e20 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11e30 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
11e40 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
11e50 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
11e60 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
11e70 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
11e80 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
11e90 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
11ea0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
11eb0 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
11ec0 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
11ed0 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
11ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
11ef0 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
11f00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
11f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11f20 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
11f30 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
11f40 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
11f50 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
11f60 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
11f70 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
11f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
11f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11fb0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
11fc0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
11fd0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
11fe0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
11ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12000 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
12010 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
12020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12040 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
12050 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
12060 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
12070 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
12080 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
12090 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
120a0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
120b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
120c0 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  ( 0==(sqlite3OsD
120d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
120e0 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
120f0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
12100 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
12110 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
12120 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
12130 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
12140 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
12150 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12160 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
12170 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
12180 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
12190 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
121a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
121b0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
121c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
121d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
121e0 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
121f0 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
12200 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
12210 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
12220 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
12230 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12240 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
12250 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12260 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
12270 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
12280 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
12290 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
122a0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
122b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
122c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
122d0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
122e0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
122f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12300 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
12310 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
12320 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
12330 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
12340 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
12350 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
12360 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
12370 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
12380 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12390 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
123a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
123b0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
123c0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
123d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
123e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
123f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
12400 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
12410 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12420 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
12430 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12440 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
12450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12460 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12470 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
12480 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
12490 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
124a0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
124b0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
124c0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
124d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
124e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
124f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12500 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12520 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
12530 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
12540 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
12550 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
12560 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
12570 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
12580 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
12590 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
125a0 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
125b0 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
125c0 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
125d0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
125e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
125f0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
12600 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
12610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12620 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
12630 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
12640 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
12670 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
12680 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
12690 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
126a0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
126b0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
126c0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
126d0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
126e0 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
126f0 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
12700 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
12710 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
12720 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
12730 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
12740 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
12750 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
12760 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
12770 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
12780 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
12790 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
127a0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
127b0 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
127c0 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
127d0 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
127e0 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
127f0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
12800 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
12810 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
12820 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
12830 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
12840 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12850 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12860 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
12870 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
12880 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12890 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
128a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
128b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
128c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
128d0 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
128e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
128f0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
12900 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
12910 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
12920 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
12930 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
12940 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
12950 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
12960 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
12970 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
12980 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
12990 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
129a0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
129b0 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
129c0 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
129d0 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
129e0 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
129f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
12a00 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
12a10 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
12a20 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
12a30 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
12a40 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
12a50 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
12a60 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
12a70 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
12a80 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
12a90 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
12aa0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
12ab0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
12ac0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
12ad0 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
12ae0 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
12af0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
12b00 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
12b10 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
12b20 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
12b30 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
12b40 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
12b50 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12b60 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
12b70 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
12b80 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
12b90 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
12ba0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
12bb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
12bc0 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
12bd0 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
12be0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12bf0 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
12c00 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
12c20 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
12c30 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
12c40 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
12c50 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
12c60 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
12c70 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
12c80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
12c90 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
12ca0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
12cb0 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
12cc0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
12cd0 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
12ce0 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
12cf0 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
12d00 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
12d10 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
12d20 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
12d30 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
12d40 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
12d50 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
12d60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
12d70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
12d80 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
12d90 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
12da0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
12db0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
12dc0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
12dd0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
12de0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
12df0 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
12e00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
12e10 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
12e20 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
12e30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
12e40 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65  OINLINE int vdbe
12e50 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
12e60 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
12e70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
12e80 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
12e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12ea0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
12eb0 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
12ec0 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
12ed0 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72  ment-1;..  asser
12ee0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
12ef0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
12f00 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
12f10 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28  EASE);.  assert(
12f20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
12f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12f40 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
12f50 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
12f60 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
12f70 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
12f80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
12f90 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
12fa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65  ITE_OK;.    Btre
12fb0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12fc0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
12fd0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66   pBt ){.      if
12fe0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12ff0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
13000 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
13010 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
13020 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
13030 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
13040 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
13050 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
13060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13070 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13080 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
13090 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
130a0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
130b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
130c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
130d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
130e0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
130f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d  .    }.  }.  db-
13100 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
13110 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
13120 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
13130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13140 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
13150 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13160 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13170 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
13180 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
13190 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
131a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
131b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
131c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
131d0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
131e0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
131f0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
13200 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oint);.    }.  }
13210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
13220 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13230 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
13240 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
13250 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  estore the .  **
13260 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13270 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
13280 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
13290 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
132a0 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65  d when .  ** the
132b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
132c0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
132d0 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70  d.  */.  if( eOp
132e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
132f0 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  BACK ){.    db->
13300 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
13310 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
13320 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
13330 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
13340 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
13350 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13360 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
13370 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
13380 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
13390 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  p){.  if( p->db-
133a0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
133b0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
133c0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
133d0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
133e0 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74   eOp);.  }.  ret
133f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13400 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
13410 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13420 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
13430 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
13440 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
13450 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
13460 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
13470 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
13480 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
13490 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
134a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
134b0 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
134c0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
134d0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
134e0 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
134f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
13500 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
13510 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
13520 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
13530 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
13540 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
13550 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
13560 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
13570 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
13580 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
13590 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
135a0 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
135b0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
135c0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
135d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
135e0 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
135f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
13600 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
13610 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
13620 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
13630 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
13640 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
13650 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
13660 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
13670 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
13680 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
13690 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
136a0 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
136b0 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
136c0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
136d0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
136e0 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
136f0 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
13700 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
13710 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f  VdbeError(p, "FO
13720 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
13730 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
13740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13750 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13770 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13790 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
137a0 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
137b0 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
137c0 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
137d0 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
137e0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
137f0 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
13800 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
13810 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
13820 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
13830 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
13840 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13850 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
13860 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
13870 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
13880 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
13890 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
138a0 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
138b0 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
138c0 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
138d0 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
138e0 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
138f0 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
13900 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
13910 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
13920 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
13930 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
13940 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
13950 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
13960 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
13970 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13980 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
13990 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
139a0 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
139b0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
139c0 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
139d0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
139e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
139f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13a10 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
13a20 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
13a30 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
13a40 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
13a50 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
13a60 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
13a70 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
13a80 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
13a90 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
13aa0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
13ab0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
13ac0 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
13ad0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
13ae0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
13af0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
13b00 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
13b10 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
13b20 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
13b30 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
13b40 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
13b50 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
13b60 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
13b70 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
13b80 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
13b90 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
13ba0 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
13bb0 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
13bc0 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
13bd0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
13be0 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
13bf0 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
13c00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
13c10 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
13c20 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
13c30 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
13c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
13c50 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
13c60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13c70 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
13c80 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
13c90 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
13ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13cb0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
13cc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13cd0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
13ce0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13cf0 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
13d00 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41  ors(p);.  checkA
13d10 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
13d20 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
13d30 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
13d40 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
13d50 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
13d60 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
13d70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
13d80 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
13d90 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
13da0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
13db0 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
13dc0 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
13dd0 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
13de0 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
13df0 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
13e00 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
13e10 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
13e20 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
13e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13e40 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
13e50 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
13e60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
13e70 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
13e80 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
13e90 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
13ea0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
13eb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
13ec0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13ed0 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
13ee0 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
13ef0 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
13f00 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
13f10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
13f20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
13f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f40 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
13f50 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
13f60 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
13f70 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL.             
13f80 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 63          || p->rc
13f90 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 44 45  ==SQLITE_BUSY_DE
13fa0 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 69 66 28 20  ADLOCK;.    if( 
13fb0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
13fc0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
13fd0 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
13fe0 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
13ff0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
14000 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 20  TE_INTERRUPT.   
14010 20 20 20 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f     ** or SQLITE_
14020 42 55 53 59 5f 53 45 52 56 45 52 2c 20 6e 6f 20  BUSY_SERVER, no 
14030 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
14040 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
14050 2c 20 61 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c  , at .      ** l
14060 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74  east a savepoint
14070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
14080 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
14090 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 0a   to restore the.
140a0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
140b0 65 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  e to a consisten
140c0 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
140d0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
140e0 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
140f0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
14100 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
14110 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
14120 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
14130 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
14140 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
14150 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
14160 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
14170 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
14180 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
14190 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
141a0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
141b0 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
141c0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
141d0 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
141e0 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
141f0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
14200 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
14210 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
14220 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
14230 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
14240 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
14250 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
14260 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
14270 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
14280 6c 79 20 7c 7c 20 28 6d 72 63 21 3d 53 51 4c 49  ly || (mrc!=SQLI
14290 54 45 5f 49 4e 54 45 52 52 55 50 54 20 26 26 20  TE_INTERRUPT && 
142a0 6d 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59  mrc!=SQLITE_BUSY
142b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
142c0 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
142d0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
142e0 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
142f0 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
14300 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
14310 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
14320 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
14330 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14340 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
14350 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
14360 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
14370 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
14380 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
14390 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
143a0 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
143b0 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
143c0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
143d0 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
143e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
143f0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14400 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14410 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14430 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
14440 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
14450 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
14460 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
14470 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14490 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
144a0 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
144b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
144c0 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
144d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
144e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
144f0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
14500 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
14510 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
14520 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
14530 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
14540 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
14550 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
14560 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
14570 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
14580 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
14590 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
145a0 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
145b0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
145c0 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
145d0 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
145e0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
145f0 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
14600 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
14610 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
14620 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
14630 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
14640 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
14650 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
14660 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
14670 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
14680 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
14690 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
146a0 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
146b0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
146c0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
146d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
146e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
146f0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
14700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
14720 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
14730 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
14740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14750 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
14760 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14770 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
14780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
147a0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
147b0 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
147c0 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
147d0 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
147e0 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
147f0 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
14800 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
14810 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
14820 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
14830 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
14840 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
14850 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
14860 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
14870 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
14880 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
14890 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
148a0 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
148b0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
148c0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
148d0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
148e0 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
148f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
14900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
14910 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
14920 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
14930 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
14940 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
14950 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
14960 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
14970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14980 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
14990 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
149a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
149b0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
149c0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
149d0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
149e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
149f0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
14a00 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
14a10 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
14a20 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
14a30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14a40 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
14a50 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
14a60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14a70 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
14a80 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
14a90 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }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 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
14ad0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14ae0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14af0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
14b00 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
14b10 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14b20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
14b30 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14b40 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
14b50 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
14b60 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
14b70 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
14b80 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
14b90 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
14ba0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
14bb0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
14bc0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
14bd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14be0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14c00 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14c10 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
14c20 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
14c30 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
14c40 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
14c50 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14c60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
14c70 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14c80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14c90 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
14ca0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
14cb0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
14cc0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14cd0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
14ce0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
14cf0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
14d00 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
14d10 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
14d20 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
14d30 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
14d40 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
14d50 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
14d60 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
14d70 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
14d80 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
14d90 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14da0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
14db0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
14dc0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
14dd0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
14de0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
14df0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
14e00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
14e10 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
14e20 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
14e30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14e40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
14e60 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
14e70 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
14e80 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
14e90 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
14ea0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14eb0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
14ec0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
14ed0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
14ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
14ef0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
14f00 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
14f10 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
14f20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
14f30 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
14f40 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
14f50 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
14f60 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14f70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
14f80 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
14f90 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
14fa0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
14fb0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
14fc0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
14fd0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
14fe0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
14ff0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
15000 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
15010 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
15020 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
15030 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
15040 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
15050 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
15060 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
15070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
15080 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
15090 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
150a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
150b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
150c0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
150d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
150e0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
150f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
15100 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
15110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
15120 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
15130 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
15140 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
15150 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
15160 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
15170 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
15180 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
15190 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
151a0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
151b0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
151c0 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
151d0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
151e0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
151f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
15200 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
15210 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
15220 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
15230 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
15240 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
15250 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
15260 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
15270 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
15280 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
15290 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
152a0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64  Cnt(db);.  if( d
152b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
152c0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
152d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
152e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
152f0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
15300 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
15310 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
15320 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
15330 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
15340 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
15350 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
15360 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
15370 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
15380 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
15390 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
153a0 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
153b0 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
153c0 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
153d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
153e0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
153f0 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
15400 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
15410 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
15420 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
15430 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
15440 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
15450 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
15460 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
15470 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
15480 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
15490 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
154a0 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
154b0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
154c0 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
154d0 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
154e0 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
154f0 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
15500 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
15510 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
15520 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
15530 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
15540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15550 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
15560 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
15570 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
15580 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
15590 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
155a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
155b0 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
155c0 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
155d0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
155e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
155f0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
15600 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
15610 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
15620 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15630 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
15640 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
15650 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
15660 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
15670 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
15680 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
15690 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
156a0 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
156b0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
156c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
156d0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
156e0 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
156f0 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65  g ){.    db->bBe
15700 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20  nignMalloc++;.  
15710 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15720 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15730 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d    if( db->pErr==
15740 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73  0 ) db->pErr = s
15750 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
15760 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
15770 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
15780 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
15790 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
157a0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
157b0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
157c0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
157d0 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  );.    db->bBeni
157e0 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20  gnMalloc--;.    
157f0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
15800 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
15810 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
15820 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
15830 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
15840 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
15850 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
15860 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
15870 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
15880 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
15890 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
158a0 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
158b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
158c0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
158d0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
158e0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
158f0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
15900 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
15910 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
15920 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
15930 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
15940 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
15950 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
15960 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
15970 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
15980 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
15990 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
159a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
159b0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
159c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
159d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
159e0 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
159f0 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
15a00 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
15a10 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
15a20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
15a30 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
15a40 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
15a50 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
15a60 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
15a70 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
15a80 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
15a90 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
15aa0 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
15ab0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
15ac0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
15ad0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
15ae0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
15af0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
15b00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
15b10 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
15b20 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
15b30 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
15b40 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
15b50 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
15b60 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
15b70 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
15b80 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
15b90 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
15ba0 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
15bb0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
15bc0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
15bd0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
15be0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15bf0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
15c00 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
15c10 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
15c20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
15c30 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
15c40 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
15c50 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
15c60 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
15c70 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
15c80 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
15c90 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
15ca0 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
15cb0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15cc0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
15cd0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
15ce0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
15cf0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
15d00 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
15d10 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
15d20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
15d30 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
15d40 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15d50 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
15d60 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
15d70 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
15d80 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
15d90 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
15da0 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
15db0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
15dc0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
15dd0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
15de0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
15df0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
15e00 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15e10 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
15e20 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
15e30 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
15e40 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
15e50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15e60 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
15e70 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
15e80 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
15e90 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
15ea0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
15eb0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
15ec0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
15ed0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
15ee0 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
15ef0 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
15f00 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
15f10 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
15f20 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
15f30 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
15f40 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
15f50 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
15f60 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
15f70 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
15f80 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
15f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
15fa0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
15fb0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
15fc0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
15fd0 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
15fe0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15ff0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
16000 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
16010 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
16020 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
16030 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
16040 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
16050 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
16060 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
16070 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
16080 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
16090 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
160a0 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
160b0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
160c0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
160d0 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
160e0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
160f0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
16100 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
16110 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
16120 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
16130 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
16140 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
16150 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
16160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16170 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
16180 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
16190 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
161a0 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
161b0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
161c0 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
161d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
161e0 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
161f0 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
16200 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
16210 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
16220 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
16230 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
16240 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
16250 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16260 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
16270 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
16280 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
16290 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
162a0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
162b0 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
162c0 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
162d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
162e0 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
162f0 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
16300 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
16310 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
16320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
16330 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
16340 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
16350 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
16360 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
16370 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
16380 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
16390 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
163a0 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
163b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
163c0 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
163d0 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
163e0 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
163f0 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
16400 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
16410 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
16420 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20  RESET;.  return 
16430 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
16440 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
16450 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
16460 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
16470 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
16480 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
16490 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
164a0 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
164b0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
164c0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
164d0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
164e0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
164f0 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
16500 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16510 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
16520 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
16530 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
16540 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
16550 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16560 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
16570 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
16580 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
16590 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
165a0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
165b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
165c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
165d0 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
165e0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
165f0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
16600 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
16610 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
16620 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
16630 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
16640 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
16650 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
16660 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
16670 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
16680 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
16690 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
166a0 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
166b0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
166c0 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
166d0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
166e0 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
166f0 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
16700 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
16710 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
16720 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
16730 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
16740 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
16750 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
16760 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
16770 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
16780 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
16790 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
167a0 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
167b0 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
167c0 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
167d0 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
167e0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
167f0 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
16800 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
16810 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
16820 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
16830 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
16840 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
16850 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16860 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73  eDeleteAuxData(s
16870 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44  qlite3 *db, AuxD
16880 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f  ata **pp, int iO
16890 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
168a0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
168b0 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
168c0 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
168d0 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
168e0 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
168f0 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
16900 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
16910 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
16920 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
16930 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
16940 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
16950 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
16960 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
16970 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
16980 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
16990 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
169a0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
169b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
169c0 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  e(db, pAux);.   
169d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
169e0 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
169f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
16a00 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
16a10 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
16a20 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
16a30 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
16a40 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
16a50 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
16a60 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
16a70 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
16a80 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
16a90 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
16aa0 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
16ab0 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
16ac0 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
16ad0 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
16ae0 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
16af0 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
16b00 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
16b10 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
16b20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
16b30 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
16b40 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
16b50 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
16b60 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
16b70 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
16b80 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
16b90 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73  ub, *pNext;.  as
16ba0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
16bb0 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
16bc0 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
16bd0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
16be0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
16bf0 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
16c00 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
16c10 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
16c20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
16c30 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
16c40 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16c50 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
16c60 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
16c70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16c80 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66   pSub);.  }.  if
16c90 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
16ca0 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20  _MAGIC_INIT ){. 
16cb0 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
16cc0 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
16cd0 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Var);.    sqlite
16ce0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
16cf0 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  VList);.    sqli
16d00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16d10 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76  >pFree);.  }.  v
16d20 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
16d30 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
16d40 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
16d50 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
16d60 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
16d70 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
16d80 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
16d90 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
16da0 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20  ANSTATUS.  {.   
16db0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
16dc0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b  i=0; i<p->nScan;
16dd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
16de0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16df0 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65  ->aScan[i].zName
16e00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16e10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16e20 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65  ->aScan);.  }.#e
16e30 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
16e40 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
16e50 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
16e60 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
16e70 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
16e80 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
16e90 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
16ea0 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
16eb0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
16ec0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16ed0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16ee0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
16ef0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
16f00 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
16f10 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
16f20 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16f30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
16f40 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
16f50 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
16f60 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
16f70 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
16f80 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
16f90 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
16fa0 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
16fb0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
16fc0 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
16fd0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
16fe0 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
16ff0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
17000 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e  or "p" has a pen
17010 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74  ding seek operat
17020 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
17030 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72   yet been.** car
17040 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20  ried out.  Seek 
17050 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20  the cursor now. 
17060 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
17070 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  urs, return.** t
17080 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
17090 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
170a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
170b0 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44  NOINLINE handleD
170c0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64  eferredMoveto(Vd
170d0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
170e0 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
170f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
17100 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
17110 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
17120 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
17130 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  rt( p->deferredM
17140 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72  oveto );.  asser
17150 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
17160 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
17170 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
17180 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20  BTREE );.  rc = 
17190 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
171a0 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63  toUnpacked(p->uc
171b0 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  .pCursor, 0, p->
171c0 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
171d0 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
171e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
171f0 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
17200 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17210 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20  PT_BKPT;.#ifdef 
17220 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
17230 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
17240 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
17250 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
17260 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
17270 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
17280 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
17290 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
172a0 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
172b0 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
172c0 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
172d0 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
172e0 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
172f0 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
17300 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
17310 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
17320 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
17330 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
17340 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
17350 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
17360 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
17370 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
17380 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
17390 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
173a0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
173b0 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
173c0 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
173d0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
173e0 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
173f0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
17400 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
17410 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
17420 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
17430 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
17440 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
17450 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
17460 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
17470 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e    assert( p->uc.
17480 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
17490 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
174a0 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
174b0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
174c0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
174d0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
174e0 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72  store(p->uc.pCur
174f0 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
17500 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
17510 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
17520 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
17530 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
17540 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
17550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17560 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
17570 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
17580 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
17590 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
175a0 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
175b0 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
175c0 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
175d0 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
175e0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
175f0 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
17600 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
17610 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
17620 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
17630 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28  E_BTREE );.  if(
17640 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
17650 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
17660 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
17670 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
17680 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
17690 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
176a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
176b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
176c0 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
176d0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
176e0 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
176f0 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
17700 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
17710 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17720 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
17730 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
17740 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
17750 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
17760 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
17770 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
17780 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
17790 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
177a0 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
177b0 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
177c0 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
177d0 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
177e0 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
177f0 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
17800 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
17810 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
17820 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
17830 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
17840 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
17850 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
17860 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
17870 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
17880 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
17890 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
178a0 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
178b0 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
178c0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
178d0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
178e0 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
178f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17900 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17910 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
17920 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c  VdbeCursor **pp,
17930 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20   int *piCol){.  
17940 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20  VdbeCursor *p = 
17950 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43  *pp;.  if( p->eC
17960 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
17970 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28  BTREE ){.    if(
17980 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
17990 74 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  to ){.      int 
179a0 69 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20  iMap;.      if( 
179b0 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69  p->aAltMap && (i
179c0 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70  Map = p->aAltMap
179d0 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b  [1+*piCol])>0 ){
179e0 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70  .        *pp = p
179f0 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20  ->pAltCursor;.  
17a00 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
17a10 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  Map - 1;.       
17a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17a30 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
17a40 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
17a50 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
17a60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
17a70 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17a80 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
17a90 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
17aa0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
17ab0 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
17ac0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17ae0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
17af0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
17b00 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
17b10 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
17b20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17b30 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
17b40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
17b50 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
17b60 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a  dbeSerialPut().*
17b70 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
17b80 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65  ialGet().**.** e
17b90 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
17ba0 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
17bb0 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
17bc0 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
17bd0 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
17be0 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
17bf0 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
17c00 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
17c10 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
17c20 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
17c30 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
17c40 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
17c50 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
17c60 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
17c70 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
17c80 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
17c90 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
17ca0 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
17cb0 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
17cc0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
17cd0 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
17ce0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
17cf0 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
17d00 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
17d10 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
17d20 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
17d30 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
17d40 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
17d50 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
17d60 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
17d70 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
17d80 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
17d90 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
17da0 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
17db0 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c  a blob separatel
17dc0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
17dd0 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
17de0 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
17df0 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
17e00 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
17e10 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
17e20 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
17e30 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
17e40 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
17e50 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
17e60 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
17e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
17e80 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
17e90 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17ea0 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
17eb0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
17ec0 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
17ed0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17ee0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
17f10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17f20 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
17f40 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
17f50 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
17f60 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
17f70 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
17f80 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17f90 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
17fc0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17fd0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
17fe0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
17ff0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
18000 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
18030 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
18040 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
18050 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
18060 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
18070 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
18080 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
18090 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
180a0 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
180b0 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
180c0 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
180f0 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
18100 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
18110 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
18120 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
18130 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
18140 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
18150 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
18160 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
18170 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
18180 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
18190 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
181a0 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
181b0 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
181c0 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
181d0 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
181e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
181f0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
18200 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
18210 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
18220 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
18230 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
18240 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
18250 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a  at, u32 *pLen){.
18260 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
18270 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32  em->flags;.  u32
18280 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   n;..  assert( p
18290 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Len!=0 );.  if( 
182a0 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
182b0 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b  {.    *pLen = 0;
182c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
182d0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
182e0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
182f0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
18300 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
18310 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
18320 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
18330 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
18340 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
18350 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
18360 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
18370 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
18380 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d  i<0 ){.      u =
18390 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ~i;.    }else{.
183a0 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20        u = i;.   
183b0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32   }.    if( u<=12
183c0 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  7 ){.      if( (
183d0 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
183e0 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
183f0 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a       *pLen = 0;.
18400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38          return 8
18410 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d  +(u32)u;.      }
18420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
18430 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Len = 1;.       
18440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
18450 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18460 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c   u<=32767 ){ *pL
18470 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32  en = 2; return 2
18480 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38  ; }.    if( u<=8
18490 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20  388607 ){ *pLen 
184a0 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d  = 3; return 3; }
184b0 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
184c0 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20  483647 ){ *pLen 
184d0 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d  = 4; return 4; }
184e0 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
184f0 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d  6BYTE ){ *pLen =
18500 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a   6; return 5; }.
18510 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
18520 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
18530 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
18540 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Real ){.    *pL
18550 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
18560 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
18570 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
18580 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
18590 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
185a0 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
185b0 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
185c0 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
185d0 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
185e0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
185f0 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
18600 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70  .nZero;.  }.  *p
18610 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  Len = n;.  retur
18620 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
18630 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
18640 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
18650 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65  The sizes for se
18660 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20  rial types less 
18670 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74  than 128.*/.stat
18680 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69  ic const u8 sqli
18690 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
186a0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
186b0 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20  /*  0   1   2   
186c0 33 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20  3   4   5   6   
186d0 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a  7   8   9 */   .
186e0 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20  /*   0 */   0,  
186f0 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20  1,  2,  3,  4,  
18700 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20  6,  8,  8,  0,  
18710 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30  0,./*  10 */   0
18720 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
18730 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33  ,  1,  2,  2,  3
18740 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20  ,  3,./*  20 */ 
18750 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c    4,  4,  5,  5,
18760 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c    6,  6,  7,  7,
18770 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20    8,  8,./*  30 
18780 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20  */   9,  9, 10, 
18790 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20  10, 11, 11, 12, 
187a0 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20  12, 13, 13,./*  
187b0 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31  40 */  14, 14, 1
187c0 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31  5, 15, 16, 16, 1
187d0 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f  7, 17, 18, 18,./
187e0 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39  *  50 */  19, 19
187f0 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31  , 20, 20, 21, 21
18800 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33  , 22, 22, 23, 23
18810 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c  ,./*  60 */  24,
18820 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c   24, 25, 25, 26,
18830 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c   26, 27, 27, 28,
18840 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20   28,./*  70 */  
18850 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20  29, 29, 30, 30, 
18860 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20  31, 31, 32, 32, 
18870 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a  33, 33,./*  80 *
18880 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33  /  34, 34, 35, 3
18890 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33  5, 36, 36, 37, 3
188a0 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39  7, 38, 38,./*  9
188b0 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30  0 */  39, 39, 40
188c0 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32  , 40, 41, 41, 42
188d0 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a  , 42, 43, 43,./*
188e0 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c   100 */  44, 44,
188f0 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c   45, 45, 46, 46,
18900 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c   47, 47, 48, 48,
18910 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20  ./* 110 */  49, 
18920 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20  49, 50, 50, 51, 
18930 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20  51, 52, 52, 53, 
18940 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35  53,./* 120 */  5
18950 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35  4, 54, 55, 55, 5
18960 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b  6, 56, 57, 57.};
18970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18980 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
18990 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
189a0 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
189b0 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
189c0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
189d0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
189e0 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
189f0 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
18a00 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20  type>=128 ){.   
18a10 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
18a20 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
18a30 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
18a40 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
18a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
18a60 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18a70 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
18a80 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65  e]==(serial_type
18a90 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20   - 12)/2 );.    
18aa0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d  return sqlite3Sm
18ab0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18ac0 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
18ad0 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f  .u8 sqlite3VdbeO
18ae0 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65  neByteSerialType
18af0 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79  Len(u8 serial_ty
18b00 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
18b10 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29  erial_type<128 )
18b20 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
18b30 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
18b40 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20  [serial_type];  
18b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
18b60 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
18b70 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
18b80 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
18b90 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
18ba0 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
18bb0 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
18bc0 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
18bd0 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
18be0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
18bf0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
18c00 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
18c10 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
18c20 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
18c30 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
18c40 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
18c50 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
18c60 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
18c70 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
18c80 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
18c90 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
18ca0 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
18cb0 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
18cc0 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
18cd0 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
18ce0 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
18cf0 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
18d00 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
18d10 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
18d20 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
18d30 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
18d40 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
18d50 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
18d60 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
18d70 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
18d80 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
18d90 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
18da0 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
18db0 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
18dc0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
18dd0 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
18de0 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
18df0 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
18e00 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
18e10 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
18e20 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
18e30 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
18e40 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
18e50 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
18e60 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
18e70 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
18e80 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
18e90 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
18ea0 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
18eb0 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
18ec0 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
18ed0 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
18ee0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
18ef0 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
18f00 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
18f10 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
18f20 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
18f30 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
18f40 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
18f50 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
18f60 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
18f70 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
18f80 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
18f90 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
18fa0 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
18fb0 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
18fc0 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
18fd0 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
18fe0 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
18ff0 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
19000 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
19010 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
19020 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
19030 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
19040 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
19050 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
19060 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
19070 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
19080 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
19090 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
190a0 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
190b0 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
190c0 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
190d0 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
190e0 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
190f0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
19100 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
19110 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
19120 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
19130 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
19140 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
19150 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
19160 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
19170 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
19180 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
19190 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
191a0 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
191b0 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
191c0 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
191d0 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
191e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
191f0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
19200 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
19210 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
19220 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
19230 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
19240 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
19250 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
19260 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
19270 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
19280 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
19290 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
192a0 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
192b0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
192c0 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
192d0 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
192e0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
192f0 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
19300 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
19310 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
19320 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
19330 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
19340 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
19350 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
19360 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
19370 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
19380 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
19390 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
193a0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
193b0 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
193c0 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
193d0 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
193e0 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20   in buf[].  The 
193f0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
19400 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c  sible.** for all
19410 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73  ocating enough s
19420 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f  pace to buf[] to
19430 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
19440 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76   field, exclusiv
19450 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d  e.** of the pMem
19460 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20  ->u.nZero bytes 
19470 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76  for a MEM_Zero v
19480 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alue..**.** Retu
19490 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
194a0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
194b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
194c0 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
194d0 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
194e0 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
194f0 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
19500 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
19510 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
19520 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
19530 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
19540 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
19550 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
19560 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   *buf, Mem *pMem
19570 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  , u32 serial_typ
19580 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  e){.  u32 len;..
19590 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
195a0 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
195b0 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
195c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
195d0 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
195e0 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
195f0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
19600 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19610 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
19620 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a  f(pMem->u.r) );.
19630 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
19640 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a   &pMem->u.r, siz
19650 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
19660 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
19670 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
19680 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
19690 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
196a0 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
196b0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
196c0 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
196d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
196e0 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
196f0 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29   buf[--i] = (u8)
19700 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
19710 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68  v >>= 8;.    }wh
19720 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65  ile( i );.    re
19730 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
19740 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
19750 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
19760 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
19770 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
19780 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
19790 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
197a0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
197c0 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
197d0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
197e0 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
197f0 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
19800 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29  .    if( len>0 )
19810 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
19820 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
19830 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
19840 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
19850 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
19860 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
19870 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73  ./* Input "x" is
19880 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75   a sequence of u
19890 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65  nsigned characte
198a0 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  rs that represen
198b0 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61  t a.** big-endia
198c0 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75  n integer.  Retu
198d0 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  rn the equivalen
198e0 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  t native integer
198f0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f  .*/.#define ONE_
19900 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
19910 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66  (i8)(x)[0]).#def
19920 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  ine TWO_BYTE_INT
19930 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29  (x)    (256*(i8)
19940 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29  ((x)[0])|(x)[1])
19950 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42  .#define THREE_B
19960 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35  YTE_INT(x)  (655
19970 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  36*(i8)((x)[0])|
19980 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[1]<<8)|(x)[
19990 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  2]).#define FOUR
199a0 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28  _BYTE_UINT(x)  (
199b0 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34  ((u32)(x)[0]<<24
199c0 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
199d0 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
199e0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
199f0 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37  BYTE_INT(x) (167
19a00 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30  77216*(i8)((x)[0
19a10 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  ])|((x)[1]<<16)|
19a20 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
19a30 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  3])../*.** Deser
19a40 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
19a50 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
19a60 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
19a70 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
19a80 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
19a90 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
19aa0 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
19ab0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
19ac0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
19ad0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
19ae0 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73  emented as two s
19af0 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73  eparate routines
19b00 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65   for performance
19b10 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73  ..** The few cas
19b20 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  es that require 
19b30 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
19b40 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  are broken out i
19b50 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a  nto a separate.*
19b60 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  * routine so tha
19b70 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  t in most cases 
19b80 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
19b90 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b  moving the stack
19ba0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61   pointer.** is a
19bb0 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  voided..*/ .stat
19bc0 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f  ic u32 SQLITE_NO
19bd0 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74  INLINE serialGet
19be0 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
19bf0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
19c00 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
19c10 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
19c20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
19c30 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
19c40 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
19c50 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
19c60 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
19c90 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
19ca0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75  e into */.){.  u
19cb0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
19cc0 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33  _UINT(buf);.  u3
19cd0 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  2 y = FOUR_BYTE_
19ce0 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78  UINT(buf+4);.  x
19cf0 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a   = (x<<32) + y;.
19d00 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
19d10 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==6 ){.    /* E
19d20 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
19d30 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20  851-52272 Value 
19d40 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19d50 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77  64-bit.    ** tw
19d60 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19d70 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d  teger. */.    pM
19d80 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
19d90 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
19da0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19db0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19dc0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
19dd0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
19de0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34  DENCE-OF: R-5734
19df0 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73  3-49114 Value is
19e00 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45   a big-endian IE
19e10 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62  EE 754-2008 64-b
19e20 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  it.    ** floati
19e30 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e  ng point number.
19e40 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
19e50 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
19e60 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19e70 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
19e80 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
19e90 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
19ea0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19eb0 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
19ec0 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20  ame.    ** byte 
19ed0 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
19ee0 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
19ef0 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
19f00 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  OAT is.    ** de
19f10 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
19f20 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
19f30 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
19f40 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20  re mixed.    ** 
19f50 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  endian..    */. 
19f60 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
19f70 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
19f80 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
19f90 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19fa0 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
19fb0 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74  ;.    u64 t2 = t
19fc0 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  1;.    swapMixed
19fd0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
19fe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
19ff0 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
1a000 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
1a010 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
1a020 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
1a030 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
1a040 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
1a050 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d  eof(pMem->u.r)==
1a060 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
1a070 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
1a080 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
1a090 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a  em->u.r, &x, siz
1a0a0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
1a0b0 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
1a0c0 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e  e3IsNaN(pMem->u.
1a0d0 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
1a0e0 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  MEM_Real;.  }.  
1a0f0 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20  return 8;.}.u32 
1a100 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a110 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
1a120 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
1a130 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
1a140 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
1a150 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
1a160 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
1a170 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1a180 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
1a190 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
1a1a0 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
1a1b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1a1c0 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
1a1d0 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
1a1e0 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1a1f0 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1a200 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
1a210 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1a220 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
1a230 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
1a240 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
1a250 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
1a260 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
1a270 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a280 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
1a290 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
1a2a0 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
1a2b0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
1a2c0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
1a2d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a2e0 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
1a2f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
1a300 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
1a310 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
1a320 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
1a330 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
1a340 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a350 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
1a360 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1a370 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a380 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a390 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a3a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1a3b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a3c0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
1a3d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a3e0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a3f0 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
1a400 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
1a410 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
1a420 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1a430 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1a440 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a450 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
1a460 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a470 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a480 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a490 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a4a0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a4b0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1a4c0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1a4d0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a4e0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a4f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a500 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
1a510 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a520 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
1a530 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a540 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a550 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a560 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
1a570 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1a580 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a590 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a5a0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a5b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
1a5c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a5d0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1a5e0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a5f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a600 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
1a610 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
1a620 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
1a630 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1a640 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1a650 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a660 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1a670 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66  TE_INT(buf);.#if
1a680 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20  def __HP_cc .   
1a690 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e     /* Work aroun
1a6a0 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69  d a sign-extensi
1a6b0 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50  on bug in the HP
1a6c0 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50   compiler for HP
1a6d0 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  /UX */.      if(
1a6e0 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70   buf[0]&0x80 ) p
1a6f0 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66  Mem->u.i |= 0xff
1a700 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c  ffffff80000000LL
1a710 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
1a720 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a730 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1a740 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1a750 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a760 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
1a770 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1a780 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1a790 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1a7a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
1a7b0 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69  85-09674 Value i
1a7c0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34  s a big-endian 4
1a7d0 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  8-bit.      ** t
1a7e0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1a7f0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1a800 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1a810 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
1a820 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1a830 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1a840 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1a850 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a860 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1a870 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1a880 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a890 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
1a8a0 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
1a8b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1a8c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
1a8d0 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
1a8e0 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
1a8f0 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f   /* These use lo
1a900 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73  cal variables, s
1a910 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73  o do them in a s
1a920 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a  eparate routine.
1a930 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
1a940 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65  d having to move
1a950 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74   the frame point
1a960 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
1a970 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72   case */.      r
1a980 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28  eturn serialGet(
1a990 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c  buf,serial_type,
1a9a0 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
1a9b0 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
1a9c0 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
1a9d0 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
1a9e0 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
1a9f0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1aa00 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56   R-12976-22893 V
1aa10 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1aa20 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 0. */.      
1aa30 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1aa40 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61  R-18143-12121 Va
1aa50 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1aa60 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70  er 1. */.      p
1aa70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
1aa80 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
1aa90 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1aaa0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
1aab0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1aac0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1aad0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1aae0 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20  : R-14606-31564 
1aaf0 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20  Value is a BLOB 
1ab00 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32  that is (N-12)/2
1ab10 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20   bytes in.      
1ab20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20  ** length..     
1ab30 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1ab40 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56   R-28401-00140 V
1ab50 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1ab60 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63   in the text enc
1ab70 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  oding and.      
1ab80 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65  ** (N-13)/2 byte
1ab90 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  s in length. */.
1aba0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1abb0 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
1abc0 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
1abd0 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
1abe0 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
1abf0 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
1ac00 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
1ac10 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
1ac20 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
1ac30 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1ac40 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
1ac50 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
1ac60 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
1ac70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ac80 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
1ac90 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1aca0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
1acb0 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
1acc0 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
1acd0 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
1ace0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1acf0 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
1ad00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1ad10 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
1ad20 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1ad30 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1ad40 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1ad50 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
1ad60 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
1ad70 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
1ad80 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
1ad90 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
1ada0 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
1adb0 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
1adc0 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
1add0 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
1ade0 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
1adf0 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
1ae00 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
1ae10 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
1ae20 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
1ae30 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
1ae40 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
1ae50 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
1ae60 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
1ae70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
1ae80 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
1ae90 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
1aea0 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
1aeb0 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
1aec0 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1aed0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
1aee0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1aef0 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
1af00 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
1af10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1af20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1af30 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
1af40 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
1af50 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1af60 6e 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  nfo             
1af70 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1af80 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
1af90 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
1afa0 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
1afb0 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1afc0 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
1afd0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  urn */.  int nBy
1afe0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1aff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b000 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
1b010 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20  ired for *p */. 
1b020 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
1b030 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
1b040 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
1b050 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
1b060 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20  >nField+1);.  p 
1b070 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1b080 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
1b090 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
1b0a0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
1b0b0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
1b0c0 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ;.  p->aMem = (M
1b0d0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
1b0e0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
1b0f0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
1b100 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1b110 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1b120 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
1b130 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1b140 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
1b150 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1b160 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1b170 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1b180 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1b190 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1b1a0 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1b1b0 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1b1c0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1b1d0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1b1e0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1b1f0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1b200 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1b210 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1b220 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1b230 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1b240 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1b250 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1b260 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1b270 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1b280 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1b290 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1b2a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1b2b0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1b2c0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1b2d0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1b2e0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1b2f0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1b300 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1b310 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1b320 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1b330 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1b340 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1b350 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1b360 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1b370 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1b380 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1b3b0 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1b3c0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1b3d0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1b3f0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1b400 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1b410 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1b420 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1b430 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1b440 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1b450 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1b460 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1b470 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1b480 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1b490 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1b4a0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1b4b0 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1b4c0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1b4d0 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1b4e0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1b4f0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1b500 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1b510 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1b520 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1b530 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1b540 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1b550 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1b560 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b570 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1b580 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1b590 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1b5a0 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d  oc = 0;.    pMem
1b5b0 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  ->z = 0;.    d +
1b5c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1b5d0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1b5e0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1b5f0 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1b600 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1b610 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1b620 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
1b630 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
1b640 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
1b650 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
1b660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1b670 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1b680 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1b690 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1b6a0 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1b6b0 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1b6c0 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1b6d0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1b6e0 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1b6f0 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1b700 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1b710 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1b720 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1b730 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1b740 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1b750 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b760 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1b770 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1b780 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1b790 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1b7a0 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1b7b0 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1b7c0 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1b7d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b7e0 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1b7f0 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1b800 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1b810 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1b820 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1b830 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1b840 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1b850 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1b860 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1b870 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1b880 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1b890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1b8a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1b8b0 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1b8c0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1b8d0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1b8e0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1b8f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1b900 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1b910 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1b920 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1b930 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1b940 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1b950 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1b960 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1b970 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1b980 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1b990 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1b9a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b9b0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b9c0 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1b9d0 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1b9e0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1b9f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1ba00 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1ba10 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1ba20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1ba30 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1ba40 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1ba50 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1ba60 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1ba70 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1ba80 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1ba90 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1baa0 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1bab0 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1bac0 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1bad0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1bae0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1baf0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1bb00 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1bb10 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1bb20 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1bb30 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1bb40 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1bb50 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1bb60 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1bb70 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1bb80 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1bb90 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1bba0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1bbb0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1bbc0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1bbd0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1bbe0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1bbf0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1bc00 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1bc10 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1bc20 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1bc30 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1bc40 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1bc50 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1bc60 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1bc70 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1bc80 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1bc90 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1bca0 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1bcb0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1bcc0 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1bcd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1bce0 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1bcf0 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1bd00 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1bd10 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1bd20 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1bd30 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1bd40 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1bd50 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1bd60 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1bd70 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1bd80 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1bd90 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1bda0 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1bdb0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1bdc0 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1bdd0 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1bde0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1bdf0 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1be00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1be10 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1be20 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1be30 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
1be40 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1be50 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1be60 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1be70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1be80 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1be90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1bea0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1beb0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1bec0 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1bed0 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1bee0 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1bef0 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1bf00 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1bf10 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1bf20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1bf30 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1bf40 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1bf50 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1bf60 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1bf70 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1bf80 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1bf90 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1bfa0 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1bfb0 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1bfc0 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1bfd0 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1bfe0 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1bff0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1c000 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1c010 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1c020 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1c030 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1c040 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1c050 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1c060 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1c070 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1c080 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1c090 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1c0a0 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
1c0b0 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
1c0c0 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
1c0d0 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
1c0e0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1c0f0 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
1c100 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
1c110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c120 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1c130 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
1c140 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
1c150 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
1c160 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1c170 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1c180 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
1c190 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
1c1a0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
1c1b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1c1c0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
1c1d0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
1c1e0 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
1c1f0 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
1c200 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1c210 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1c220 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1c230 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1c240 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1c250 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1c260 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1c270 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1c280 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1c290 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1c2a0 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1c2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1c2c0 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1c2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1c2e0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1c2f0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1c300 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1c310 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1c320 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1c330 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1c340 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1c350 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1c360 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1c370 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1c380 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1c390 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1c3a0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1c3b0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1c3c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1c3d0 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1c3e0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1c3f0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1c400 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1c410 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1c420 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1c430 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1c440 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1c450 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1c460 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1c470 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1c480 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1c490 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1c4a0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1c4b0 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1c4c0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1c4d0 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1c4e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c4f0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1c500 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1c510 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1c520 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1c530 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1c540 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1c550 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c560 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1c570 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c580 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1c590 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1c5a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c5b0 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  BUG./*.** Count 
1c5c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
1c5d0 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c  elds (a.k.a. col
1c5e0 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63  umns) in the rec
1c5f0 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20  ord given by.** 
1c600 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20  pKey,nKey.  The 
1c610 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1c620 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74   count is less t
1c630 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1c640 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76  the.** limit giv
1c650 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e  en by pKeyInfo->
1c660 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66  nField + pKeyInf
1c670 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a  o->nXField..**.*
1c680 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72  * If this constr
1c690 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69  aint is not sati
1c6a0 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20  sfied, it means 
1c6b0 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70  that the high-sp
1c6c0 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72  eed.** vdbeRecor
1c6d0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1c6e0 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  d vdbeRecordComp
1c6f0 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74  areString() rout
1c700 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  ines will.** not
1c710 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1c720 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74    If this assert
1c730 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69  () ever fires, i
1c740 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73  t probably means
1c750 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79  .** that the Key
1c760 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b  Info.nField or K
1c770 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76  eyInfo.nXField v
1c780 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75  alues were compu
1c790 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74  ted.** incorrect
1c7a0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1c7b0 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65  id vdbeAssertFie
1c7c0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1c7d0 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  its(.  int nKey,
1c7e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1c7f0 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f  y,   /* The reco
1c800 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20  rd to verify */ 
1c810 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
1c820 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20   *pKeyInfo      
1c830 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65   /* Compare size
1c840 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e   with this KeyIn
1c850 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  fo */.){.  int n
1c860 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32  Field = 0;.  u32
1c870 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64   szHdr;.  u32 id
1c880 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64  x;.  u32 notUsed
1c890 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1c8a0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1c8b0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1c8c0 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69  char*)pKey;..  i
1c8d0 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1c8e0 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20  return;.  idx = 
1c8f0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c900 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65  , szHdr);.  asse
1c910 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20  rt( nKey>=0 );. 
1c920 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d   assert( szHdr<=
1c930 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77  (u32)nKey );.  w
1c940 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1c950 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ){.    idx += ge
1c960 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69  tVarint32(aKey+i
1c970 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20  dx, notUsed);.  
1c980 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a    nField++;.  }.
1c990 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
1c9a0 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   <= pKeyInfo->nF
1c9b0 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
1c9c0 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73  XField );.}.#els
1c9d0 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41  e.# define vdbeA
1c9e0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1c9f0 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c  ithinLimits(A,B,
1ca00 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  C).#endif../*.**
1ca10 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64   Both *pMem1 and
1ca20 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20   *pMem2 contain 
1ca30 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43  string values. C
1ca40 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76  ompare the two v
1ca50 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74  alues.** using t
1ca60 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1ca70 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20  uence pColl. As 
1ca80 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20  usual, return a 
1ca90 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a  negative , zero.
1caa0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76  ** or positive v
1cab0 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69  alue if *pMem1 i
1cac0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1cad0 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72  al to or greater
1cae0 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32   than .** *pMem2
1caf0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1cb00 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69  Similar in spiri
1cb10 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65  t to "rc = (*pMe
1cb20 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22  m1) - (*pMem2);"
1cb30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cb40 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1cb50 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65  ring(.  const Me
1cb60 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73  m *pMem1,.  cons
1cb70 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20  t Mem *pMem2,.  
1cb80 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1cb90 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45  Coll,.  u8 *prcE
1cba0 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
1cbb0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
1cbc0 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74   OOM occurs, set
1cbd0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1cbe0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65   */.){.  if( pMe
1cbf0 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e  m1->enc==pColl->
1cc00 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  enc ){.    /* Th
1cc10 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c  e strings are al
1cc20 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72  ready in the cor
1cc30 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20  rect encoding.  
1cc40 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a  Call the.     **
1cc50 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1cc60 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f  tion directly */
1cc70 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  .    return pCol
1cc80 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
1cc90 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d  User,pMem1->n,pM
1cca0 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c  em1->z,pMem2->n,
1ccb0 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c  pMem2->z);.  }el
1ccc0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
1ccd0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
1cce0 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74  v1, *v2;.    int
1ccf0 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d   n1, n2;.    Mem
1cd00 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b   c1;.    Mem c2;
1cd10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cd20 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65  MemInit(&c1, pMe
1cd30 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1cd40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cd50 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70  beMemInit(&c2, p
1cd60 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1cd70 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1cd80 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1cd90 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d  py(&c1, pMem1, M
1cda0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73  EM_Ephem);.    s
1cdb0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1cdc0 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d  llowCopy(&c2, pM
1cdd0 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em2, MEM_Ephem);
1cde0 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65  .    v1 = sqlite
1cdf0 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1ce00 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20  te3_value*)&c1, 
1ce10 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1ce20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20   n1 = v1==0 ? 0 
1ce30 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d  : c1.n;.    v2 =
1ce40 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1ce50 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1ce60 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c2, pColl->en
1ce70 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d  c);.    n2 = v2=
1ce80 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20  =0 ? 0 : c2.n;. 
1ce90 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
1cea0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1ceb0 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32  , n1, v1, n2, v2
1cec0 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d  );.    if( (v1==
1ced0 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70  0 || v2==0) && p
1cee0 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20  rcErr ) *prcErr 
1cef0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1cf00 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  KPT;.    sqlite3
1cf10 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1cf20 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
1cf30 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1cf40 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  c2);.    return 
1cf50 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
1cf60 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62   The input pBlob
1cf70 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1cf80 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74  o be a Blob that
1cf90 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a   is not marked.*
1cfa0 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e  * with MEM_Zero.
1cfb0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
1cfc0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a   it could be a z
1cfd0 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  ero-blob..*/.sta
1cfe0 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72  tic int isAllZer
1cff0 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  o(const char *z,
1d000 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
1d010 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1d020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1d030 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  z[i] ) return 0;
1d040 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1d050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1d060 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65  e two blobs.  Re
1d070 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1d080 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1d090 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   if the first.**
1d0a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1d0b0 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1d0c0 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1d0d0 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ond, respectivel
1d0e0 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f  y..** If one blo
1d0f0 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  b is a prefix of
1d100 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e   the other, then
1d110 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20   the shorter is 
1d120 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73  the lessor..*/.s
1d130 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
1d140 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65  NLINE int sqlite
1d150 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e  3BlobCompare(con
1d160 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e  st Mem *pB1, con
1d170 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20  st Mem *pB2){.  
1d180 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20  int c;.  int n1 
1d190 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20  = pB1->n;.  int 
1d1a0 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20  n2 = pB2->n;..  
1d1b0 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  /* It is possibl
1d1c0 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62  e to have a Blob
1d1d0 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20   value that has 
1d1e0 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f  some non-zero co
1d1f0 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  ntent.  ** follo
1d200 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74  wed by zero cont
1d210 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f  ent.  But that o
1d220 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72  nly comes up for
1d230 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20   Blobs formed.  
1d240 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ** by the OP_Mak
1d250 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20  eRecord opcode, 
1d260 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e  and such Blobs n
1d270 65 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20  ever get passed 
1d280 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
1d290 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a  3MemCompare(). *
1d2a0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31  /.  assert( (pB1
1d2b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1d2c0 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20  ro)==0 || n1==0 
1d2d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
1d2e0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1d2f0 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30  ero)==0 || n2==0
1d300 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d   );..  if( (pB1-
1d310 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67  >flags|pB2->flag
1d320 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  s) & MEM_Zero ){
1d330 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c  .    if( pB1->fl
1d340 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73  ags & pB2->flags
1d350 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1d360 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d       return pB1-
1d370 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e  >u.nZero - pB2->
1d380 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c  u.nZero;.    }el
1d390 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67  se if( pB1->flag
1d3a0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
1d3b0 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
1d3c0 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32  Zero(pB2->z, pB2
1d3d0 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31  ->n) ) return -1
1d3e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1d3f0 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32  B1->u.nZero - n2
1d400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d410 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72     if( !isAllZer
1d420 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e  o(pB1->z, pB1->n
1d430 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  ) ) return +1;. 
1d440 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d       return n1 -
1d450 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20   pB2->u.nZero;. 
1d460 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d     }.  }.  c = m
1d470 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42  emcmp(pB1->z, pB
1d480 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32  2->z, n1>n2 ? n2
1d490 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20   : n1);.  if( c 
1d4a0 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65  ) return c;.  re
1d4b0 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a  turn n1 - n2;.}.
1d4c0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70  ./*.** Do a comp
1d4d0 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61  arison between a
1d4e0 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
1d4f0 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d  nteger and a 64-
1d500 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69  bit floating-poi
1d510 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52  nt.** number.  R
1d520 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1d530 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1d540 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28  e if the first (
1d550 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61  i64) is less tha
1d560 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  n,.** equal to, 
1d570 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1d580 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62  the second (doub
1d590 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  le)..*/.static i
1d5a0 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  nt sqlite3IntFlo
1d5b0 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c  atCompare(i64 i,
1d5c0 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66   double r){.  if
1d5d0 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55  ( sizeof(LONGDOU
1d5e0 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20  BLE_TYPE)>8 ){. 
1d5f0 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59     LONGDOUBLE_TY
1d600 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42  PE x = (LONGDOUB
1d610 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69  LE_TYPE)i;.    i
1d620 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20  f( x<r ) return 
1d630 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20  -1;.    if( x>r 
1d640 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1d650 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1d660 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20  se{.    i64 y;. 
1d670 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20     double s;.   
1d680 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30   if( r<-92233720
1d690 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20  36854775808.0 ) 
1d6a0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69  return +1;.    i
1d6b0 66 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38  f( r>92233720368
1d6c0 35 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74  54775807.0 ) ret
1d6d0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20  urn -1;.    y = 
1d6e0 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20  (i64)r;.    if( 
1d6f0 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  i<y ) return -1;
1d700 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a  .    if( i>y ){.
1d710 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41        if( y==SMA
1d720 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72  LLEST_INT64 && r
1d730 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  >0.0 ) return -1
1d740 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b  ;.      return +
1d750 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d  1;.    }.    s =
1d760 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20   (double)i;.    
1d770 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e  if( s<r ) return
1d780 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72   -1;.    if( s>r
1d790 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d7a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1d7b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1d7c0 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1d7d0 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1d7e0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1d7f0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1d800 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1d810 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1d820 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1d830 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1d840 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1d850 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1d860 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1d870 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1d880 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1d890 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1d8a0 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1d8b0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1d8c0 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1d8d0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1d8e0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1d8f0 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1d900 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1d910 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1d920 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1d930 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1d940 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1d950 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d960 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1d970 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1d980 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1d990 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1d9a0 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1d9b0 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1d9c0 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1d9d0 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1d9e0 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1d9f0 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1da00 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1da10 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
1da20 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
1da30 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
1da40 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1da50 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1da60 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1da70 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1da80 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1da90 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1daa0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1dab0 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1dac0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1dad0 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1dae0 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1daf0 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  ..  /* At least 
1db00 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76  one of the two v
1db10 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65  alues is a numbe
1db20 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  r.  */.  if( com
1db30 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1db40 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1db50 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1db60 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1db70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1db80 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1db90 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1dba0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1dbb0 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1dbc0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
1dbd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1dbe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1dbf0 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52  (f1 & f2 & MEM_R
1dc00 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1dc10 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1dc20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  < pMem2->u.r ) r
1dc30 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1dc40 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e  if( pMem1->u.r >
1dc50 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1dc60 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1dc70 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1dc80 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49     if( (f1&MEM_I
1dc90 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1dca0 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
1dcb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1dcc0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
1dcd0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1dce0 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d  em1->u.i, pMem2-
1dcf0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1dd00 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1dd10 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1dd20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1dd30 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1dd40 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1dd50 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1dd60 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71        return -sq
1dd70 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1dd80 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c  pare(pMem2->u.i,
1dd90 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20   pMem1->u.r);.  
1dda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ddb0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1ddc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ddd0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a  return +1;.  }..
1dde0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1ddf0 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1de00 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1de10 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1de20 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1de30 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1de40 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1de50 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1de60 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1de70 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1de80 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1de90 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1dea0 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1deb0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1dec0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1ded0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1dee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1def0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1df00 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1df10 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70  =pMem2->enc || p
1df20 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Mem1->db->malloc
1df30 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
1df40 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1df50 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1df60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1df70 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1df80 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1df90 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1dfa0 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1dfb0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1dfc0 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1dfd0 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1dfe0 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1dff0 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1e000 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1e010 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1e020 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1e030 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1e040 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1e050 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1e060 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1e070 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1e080 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1e090 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1e0a0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1e0b0 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1e0c0 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1e0d0 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1e0e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1e0f0 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1e100 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1e110 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1e120 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1e130 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1e140 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1e150 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1e160 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1e170 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1e180 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1e190 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1e1a0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1e1b0 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1e1c0 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1e1d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1e1e0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1e1f0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1e200 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1e210 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1e220 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1e230 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1e240 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1e250 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1e260 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1e270 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1e280 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1e290 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1e2a0 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1e2b0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1e2c0 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1e2d0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1e2e0 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1e2f0 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1e300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1e310 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1e320 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1e330 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1e340 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1e350 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1e360 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1e370 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1e380 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1e390 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1e3a0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1e3b0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1e3c0 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1e3d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e3e0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e3f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1e400 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1e410 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1e420 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e430 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e440 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1e450 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1e460 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1e470 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e480 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e490 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1e4a0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e4b0 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1e4c0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1e4d0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1e4e0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1e4f0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1e500 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1e510 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1e520 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1e530 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e540 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e550 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1e560 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1e570 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1e580 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1e590 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1e5a0 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1e5b0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1e5c0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1e5d0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e5e0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e5f0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1e600 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1e610 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1e620 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1e630 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1e640 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1e650 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1e660 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e670 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1e680 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1e690 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1e6a0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1e6b0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1e6c0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1e6d0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1e6e0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1e6f0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1e700 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1e710 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1e720 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1e730 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1e740 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1e750 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1e760 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1e770 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1e780 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1e790 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1e7a0 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1e7b0 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1e7c0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1e7d0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1e7e0 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1e7f0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1e800 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1e810 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1e820 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1e830 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1e840 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1e850 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1e860 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1e870 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1e880 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1e890 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1e8a0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1e8b0 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1e8c0 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1e8d0 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1e8e0 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1e8f0 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1e900 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1e910 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1e920 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1e930 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1e940 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1e950 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1e960 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1e970 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1e980 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1e990 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1e9a0 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1e9b0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1e9c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1e9d0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1e9e0 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1e9f0 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1ea00 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1ea10 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1ea20 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1ea30 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1ea40 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1ea50 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1ea60 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1ea70 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1ea80 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1ea90 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1eaa0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1eab0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1eac0 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1ead0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1eae0 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1eaf0 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1eb00 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1eb30 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1eb40 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1eb50 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1eb80 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1eb90 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1eba0 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1ebb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ebc0 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1ebd0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1ebe0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1ec10 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1ec20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1ec30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ec40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1ec50 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1ec60 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1ec70 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1ec80 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1ec90 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1eca0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1ecb0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1ecc0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  >pKeyInfo;.  con
1ecd0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ece0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1ecf0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ed00 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
1ed10 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
1ed20 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
1ed30 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1ed40 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
1ed50 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1ed60 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
1ed70 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
1ed80 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
1ed90 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
1eda0 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
1edb0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
1edc0 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
1edd0 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
1ede0 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
1edf0 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
1ee00 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
1ee10 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
1ee20 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1ee30 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
1ee40 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
1ee50 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
1ee60 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1ee70 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
1ee80 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
1ee90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1eea0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1eeb0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1eec0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1eed0 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
1eee0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1eef0 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
1ef00 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1ef10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ef20 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1ef30 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
1ef40 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
1ef50 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
1ef60 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1ef70 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1ef80 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1ef90 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1efa0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1efb0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1efc0 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1efd0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1efe0 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1eff0 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1f000 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1f010 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1f020 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1f030 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1f040 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1f050 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1f060 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1f070 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1f080 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1f090 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1f0a0 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1f0b0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1f0c0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1f0d0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1f0e0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1f0f0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1f100 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f110 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1f120 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1f130 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1f140 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1f150 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f160 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1f180 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1f190 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1f1a0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1f1b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1f1c0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1f1d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1f1e0 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em1);.        rc
1f1f0 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c   = -sqlite3IntFl
1f200 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d  oatCompare(pRhs-
1f210 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b  >u.i, mem1.u.r);
1f220 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f230 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1f240 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1f250 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1f260 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1f270 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1f280 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1f290 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1f2a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1f2b0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1f2c0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1f2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1f2e0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1f2f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f300 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1f310 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1f320 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1f330 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1f340 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1f350 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1f360 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f370 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1f380 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1f390 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1f3a0 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1f3b0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1f3c0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1f3d0 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1f3e0 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1f3f0 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1f400 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1f410 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1f420 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1f430 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1f440 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1f450 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1f460 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1f470 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1f480 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1f490 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1f4a0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f4b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1f4c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1f4d0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1f4e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1f4f0 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1f500 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1f510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
1f520 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1f530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65            if( me
1f540 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72  m1.u.r<pRhs->u.r
1f550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f560 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1f570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
1f580 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20  1.u.r>pRhs->u.r 
1f590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1f5a0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1f5b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1f5c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
1f5d0 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  = sqlite3IntFloa
1f5e0 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e  tCompare(mem1.u.
1f5f0 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20  i, pRhs->u.r);. 
1f600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f610 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f620 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1f630 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1f640 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1f650 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1f660 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1f670 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1f680 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1f690 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1f6a0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1f6b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1f6c0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1f6d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1f6e0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1f6f0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1f700 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1f710 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f720 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
1f730 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1f740 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1f750 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1f760 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
1f770 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1f780 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1f790 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
1f7a0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1f7b0 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
1f7c0 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
1f7d0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1f7e0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1f7f0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1f800 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f810 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1f820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f830 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1f840 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
1f850 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
1f860 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
1f870 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
1f880 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1f890 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
1f8a0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1f8b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
1f8c0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
1f8d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
1f8e0 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
1f8f0 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
1f900 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
1f910 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
1f920 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
1f930 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
1f940 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
1f950 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
1f960 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1f970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f980 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1f990 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
1f9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f9b0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1f9c0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1f9d0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1f9e0 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
1f9f0 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
1fa00 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
1fa10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fa20 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
1fa30 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1fa40 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1fa50 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
1fa60 61 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66  assert( (pRhs->f
1fa70 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1fa80 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d  ==0 || pRhs->n==
1fa90 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61  0 );.      getVa
1faa0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1fab0 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1fac0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fad0 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1fae0 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1faf0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
1fb00 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
1fb10 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1fb20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1fb30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fb40 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
1fb50 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1fb60 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1fb70 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d  ase( (d1+nStr)==
1fb80 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1fb90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1fba0 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29  ase( (d1+nStr+1)
1fbb0 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1fbc0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1fbd0 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e   (d1+nStr) > (un
1fbe0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1fbf0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1fc00 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1fc10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1fc20 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1fc30 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1fc40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1fc50 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1fc60 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d   }else if( pRhs-
1fc70 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1fc80 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
1fc90 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63  f( !isAllZero((c
1fca0 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79  onst char*)&aKey
1fcb0 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20  1[d1],nStr) ){. 
1fcc0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1fcd0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
1fce0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1fcf0 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
1fd00 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20  ->u.nZero;.     
1fd10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1fd20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fd30 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  int nCmp = MIN(n
1fd40 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  Str, pRhs->n);. 
1fd50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1fd60 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1fd70 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1fd80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1fd90 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72  c==0 ) rc = nStr
1fda0 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20   - pRhs->n;.    
1fdb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fdc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1fdd0 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65  is null */.    e
1fde0 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61  lse{.      seria
1fdf0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1fe00 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  dx1];.      rc =
1fe10 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30   (serial_type!=0
1fe20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1fe30 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1fe40 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1fe50 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1fe60 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1fe70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fe80 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
1fe90 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1fea0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1feb0 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20  ey2, rc) );.    
1fec0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1fed0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
1fee0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
1fef0 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
1ff00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1ff10 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73     i++;.    pRhs
1ff20 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71  ++;.    d1 += sq
1ff30 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1ff40 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
1ff50 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d  pe);.    idx1 +=
1ff60 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
1ff70 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1ff80 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28    }while( idx1<(
1ff90 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20  unsigned)szHdr1 
1ffa0 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1ffb0 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69  eld && d1<=(unsi
1ffc0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20  gned)nKey1 );.. 
1ffd0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1ffe0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1fff0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
20000 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
20010 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
20020 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
20030 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
20040 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
20050 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
20060 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
20070 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
20080 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
20090 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73  mem1).  */.  ass
200a0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
200b0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
200c0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
200d0 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68  that one or both
200e0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
200f0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
20100 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
20110 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
20120 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
20130 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
20140 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
20150 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alue.  */.  asse
20160 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a  rt( CORRUPT_DB .
20170 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65         || vdbeRe
20180 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
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 70 50 4b 65 79 32 2d 3e 64  PKey2, pPKey2->d
201b0 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20  efault_rc) .    
201c0 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e     || pKeyInfo->
201d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
201e0 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e  .  );.  pPKey2->
201f0 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65  eqSeen = 1;.  re
20200 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
20210 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
20220 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20230 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
20240 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
20250 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
20260 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
20270 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
20280 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
20290 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
202a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
202b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
202c0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
202d0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
202e0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
202f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
20300 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
20310 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
20320 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
20330 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
20340 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
20350 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
20360 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
20370 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
20380 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
20390 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
203a0 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
203b0 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
203c0 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
203d0 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
203e0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
203f0 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
20400 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
20410 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
20420 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
20430 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
20440 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
20450 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
20460 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
20470 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
20480 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20490 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
204a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
204b0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
204c0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
204d0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
204e0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
204f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
20500 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
20510 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
20520 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
20530 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
20540 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
20550 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
20560 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
20570 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
20580 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73  i64 v;.  i64 lhs
20590 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
205a0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
205b0 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
205c0 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
205d0 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
205e0 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
205f0 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
20600 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
20610 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
20620 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
20630 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
20640 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
20650 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
20660 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
20670 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20680 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20690 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
206a0 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
206b0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
206c0 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
206d0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
206e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
206f0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20700 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20710 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
20720 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
20730 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
20740 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
20750 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20760 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20780 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
20790 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
207a0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
207b0 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
207c0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
207d0 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
207e0 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
207f0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20800 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20810 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
20820 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
20830 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20840 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
20850 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
20860 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
20870 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
20880 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20890 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
208a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
208b0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
208c0 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
208d0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
208e0 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
208f0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
20900 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
20910 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20920 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
20930 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
20940 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20950 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
20960 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20970 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
20980 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
20990 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
209a0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
209b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
209c0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
209d0 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
209e0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
209f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
20a00 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
20a10 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
20a20 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
20a30 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
20a40 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
20a50 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
20a60 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
20a70 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
20a80 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
20a90 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
20aa0 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
20ab0 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
20ac0 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
20ad0 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
20ae0 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
20af0 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
20b00 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
20b10 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
20b20 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
20b30 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
20b40 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
20b50 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
20b60 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
20b70 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20b80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
20b90 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20ba0 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
20bb0 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
20bc0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20bd0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
20be0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
20bf0 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65  .  }..  v = pPKe
20c00 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b  y2->aMem[0].u.i;
20c10 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
20c20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20c30 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
20c40 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
20c50 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
20c60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
20c70 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
20c80 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
20c90 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
20ca0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
20cb0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
20cc0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
20cd0 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
20ce0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
20cf0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
20d00 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
20d10 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
20d20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
20d30 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
20d40 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
20d50 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
20d60 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
20d70 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
20d80 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
20d90 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
20da0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
20db0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
20dc0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
20dd0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
20de0 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  n = 1;.  }..  as
20df0 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
20e00 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
20e10 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20e20 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74  2, res) );.  ret
20e30 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
20e40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20e50 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
20e60 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
20e70 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20e80 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
20e90 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
20ea0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
20eb0 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
20ec0 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
20ed0 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
20ee0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
20ef0 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
20f00 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
20f10 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
20f20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
20f30 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
20f40 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
20f50 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
20f60 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
20f70 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
20f80 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
20f90 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
20fa0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
20fb0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
20fc0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
20fd0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
20fe0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
20ff0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  ey1 = (const u8*
21000 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65  )pKey1;.  int se
21010 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74  rial_type;.  int
21020 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   res;..  assert(
21030 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21040 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  .flags & MEM_Str
21050 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74   );.  vdbeAssert
21060 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
21070 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
21080 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
21090 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72  yInfo);.  getVar
210a0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
210b0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
210c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
210d0 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
210e0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
210f0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
21100 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
21110 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
21120 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
21130 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
21140 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
21150 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
21160 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
21170 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
21180 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
21190 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
211a0 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
211b0 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
211c0 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
211d0 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
211e0 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
211f0 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  r) > nKey1 ){.  
21200 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
21210 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
21220 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21230 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
21240 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
21250 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
21260 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
21270 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
21280 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
21290 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
212a0 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
212b0 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
212c0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
212d0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
212e0 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
212f0 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
21300 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
21310 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
21320 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
21330 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
21340 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21350 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
21360 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21370 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
21380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
21390 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
213a0 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
213b0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
213c0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
213d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
213e0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
213f0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21400 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
21410 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
21420 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
21430 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
21440 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
21450 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
21460 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21470 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21480 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
21490 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
214a0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
214b0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
214c0 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
214d0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
214e0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
214f0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
21500 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
21510 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
21520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21530 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
21540 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21550 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
21560 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
21570 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
21580 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
21590 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
215a0 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
215b0 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
215c0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
215d0 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
215e0 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
215f0 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
21600 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
21610 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
21620 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
21630 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
21640 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
21650 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
21660 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
21670 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
21680 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
21690 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
216a0 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
216b0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
216c0 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
216d0 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
216e0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
216f0 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
21700 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
21710 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
21720 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
21730 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
21740 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
21750 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
21760 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
21770 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
21780 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
21790 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
217a0 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
217b0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
217c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
217d0 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
217e0 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
217f0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
21800 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
21810 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
21820 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
21830 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
21840 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
21850 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
21860 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
21870 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
21880 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
21890 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
218a0 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
218b0 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
218c0 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
218d0 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
218e0 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
218f0 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
21900 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
21910 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
21920 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
21930 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
21940 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  s.  */.  if( (p-
21950 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
21960 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  d + p->pKeyInfo-
21970 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b  >nXField)<=13 ){
21980 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
21990 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67   p->aMem[0].flag
219a0 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  s;.    if( p->pK
219b0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
219c0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70  er[0] ){.      p
219d0 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->r1 = 1;.      
219e0 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r2 = -1;.    
219f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
21a00 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  r1 = -1;.      p
21a10 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ->r2 = 1;.    }.
21a20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
21a30 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20   MEM_Int) ){.   
21a40 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
21a50 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a  cordCompareInt;.
21a60 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
21a70 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
21a80 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
21a90 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
21aa0 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65  M_Null );.    te
21ab0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
21ac0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
21ad0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45  if( (flags & (ME
21ae0 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c  M_Real|MEM_Null|
21af0 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26  MEM_Blob))==0 &&
21b00 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   p->pKeyInfo->aC
21b10 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  oll[0]==0 ){.   
21b20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
21b30 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
21b40 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
21b50 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
21b60 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ng;.    }.  }.. 
21b70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
21b80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  ;.}../*.** pCur 
21ba0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
21bb0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
21bc0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
21bd0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
21be0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
21bf0 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
21c00 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
21c10 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
21c20 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
21c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
21c40 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
21c50 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
21c60 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
21c70 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
21c80 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
21c90 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
21ca0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
21cb0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
21cc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
21cd0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
21ce0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
21cf0 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
21d00 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
21d10 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
21d20 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
21d30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21d40 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
21d50 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
21d60 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
21d70 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
21d80 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
21d90 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
21da0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
21db0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
21dc0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
21dd0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
21de0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
21df0 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
21e00 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
21e10 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
21e20 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
21e30 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
21e40 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
21e50 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
21e60 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
21e70 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
21e80 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
21e90 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
21ea0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
21eb0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
21ec0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
21ed0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
21ee0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
21ef0 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
21f00 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
21f10 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
21f20 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
21f30 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
21f40 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b  Cur) );.  nCellK
21f50 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
21f60 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
21f70 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e  r);.  assert( (n
21f80 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
21f90 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
21fa0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
21fb0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
21fc0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
21fd0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
21fe0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
21ff0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
22000 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
22010 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
22020 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
22030 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29  32)nCellKey, &m)
22040 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
22060 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
22070 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
22080 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
22090 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
220a0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
220b0 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
220c0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
220d0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
220e0 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
220f0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
22100 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
22110 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
22120 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
22130 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
22140 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
22150 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
22160 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
22170 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
22180 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
22190 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
221a0 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
221b0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
221c0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
221d0 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
221e0 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
221f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
22200 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
22210 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22220 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
22230 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
22240 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
22250 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
22260 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
22270 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
22280 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22290 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
222a0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
222b0 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
222c0 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
222d0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
222e0 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
222f0 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
22300 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
22310 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
22320 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
22330 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
22340 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
22350 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b  izes[typeRowid];
22360 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
22370 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
22380 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
22390 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
223a0 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
223b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
223c0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
223d0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
223e0 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
223f0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
22400 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
22410 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
22420 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
22430 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
22440 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
22450 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
22460 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
22470 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
22480 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22490 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
224a0 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
224b0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
224c0 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
224d0 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
224e0 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
224f0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
22500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22510 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
22520 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
22530 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a    testcase( m.sz
22540 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
22550 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
22560 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
22570 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22580 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
22590 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
225a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
225b0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
225c0 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
225d0 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
225e0 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
225f0 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
22600 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
22610 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
22620 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
22630 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
22640 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
22650 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
22660 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
22670 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
22680 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22690 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
226a0 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
226b0 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
226c0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
226d0 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
226e0 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
226f0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
22700 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
22710 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
22720 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
22730 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
22740 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
22750 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
22760 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
22770 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
22780 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
22790 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
227a0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
227b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
227c0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
227d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
22800 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
22810 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20  VdbeCursor *pC, 
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
22840 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
22850 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
22860 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
22870 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63  ,       /* Unpac
22880 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
22890 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  ey */.  int *res
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
228c0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
228d0 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
228e0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
228f0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
22900 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22910 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
22920 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
22930 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
22940 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  EE );.  pCur = p
22950 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
22960 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22970 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
22980 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43  id(pCur) );.  nC
22990 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
229a0 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
229b0 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65  (pCur);.  /* nCe
229c0 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
229d0 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
229e0 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
229f0 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
22a00 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
22a10 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
22a20 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
22a30 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
22a40 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
22a50 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
22a60 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
22a70 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
22a80 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
22a90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22aa0 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
22ab0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
22ac0 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
22ad0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
22ae0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
22af0 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
22b00 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
22b10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
22b20 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71  .  }.  *res = sq
22b30 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22b40 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
22b50 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73   pUnpacked);.  s
22b60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
22b70 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
22b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22b90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
22ba0 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
22bb0 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
22bc0 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
22bd0 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
22be0 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
22bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
22c00 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
22c10 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
22c20 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
22c30 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
22c40 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
22c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22c60 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
22c70 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
22c80 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
22c90 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
22ca0 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
22cb0 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
22cc0 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
22cd0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
22ce0 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
22cf0 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
22d00 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
22d10 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
22d20 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
22d30 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
22d40 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
22d50 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
22d60 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
22d70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
22d80 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22d90 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
22da0 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
22db0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
22dc0 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
22dd0 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
22de0 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
22df0 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
22e00 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
22e10 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
22e20 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
22e30 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
22e40 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
22e50 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
22e60 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
22e70 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
22e80 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
22e90 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
22ea0 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
22eb0 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
22ec0 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
22ed0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
22ee0 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
22ef0 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
22f00 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
22f10 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
22f20 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
22f30 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
22f40 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
22f50 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
22f60 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
22f70 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
22f80 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
22f90 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
22fa0 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
22fb0 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
22fc0 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
22fd0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  b;.}../*.** Retu
22fe0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22ff0 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
23000 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
23010 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
23020 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
23030 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
23040 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
23050 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
23060 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
23070 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
23080 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
23090 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
230a0 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
230b0 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
230c0 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
230d0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
230e0 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
230f0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
23100 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
23110 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
23120 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
23130 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
23140 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
23150 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
23160 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
23170 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
23180 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
23190 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
231a0 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
231b0 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
231c0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
231d0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
231e0 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
231f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
23200 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
23210 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
23220 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
23230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23240 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
23250 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
23260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
23270 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
23280 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
23290 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
232a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
232b0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
232c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
232d0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
232e0 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
232f0 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
23300 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
23310 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
23320 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
23330 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
23340 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
23350 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
23360 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
23370 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
23380 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
23390 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
233a0 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
233b0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
233c0 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20 29    if( iVar>=32 )
233d0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
233e0 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b 0a   |= 0x80000000;.
233f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
23400 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
23410 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
23420 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
23430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
23440 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
23450 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
23460 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
23470 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
23480 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
23490 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
234a0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
234b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
234c0 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
234d0 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
234e0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
234f0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
23500 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
23510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
23520 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
23530 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
23540 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69  tab *pVtab){.  i
23550 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  f( pVtab->zErrMs
23560 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
23570 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
23580 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23590 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
235a0 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
235b0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
235c0 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  p(db, pVtab->zEr
235d0 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
235e0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
235f0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74  ErrMsg);.    pVt
23600 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
23610 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
23620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23630 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
23640 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
23650 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
23660 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K../*.** If the 
23670 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
23680 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c  is not NULL, rel
23690 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74  ease any allocat
236a0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
236b0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d  .** with the mem
236c0 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  ory cells in the
236d0 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79   p->aMem[] array
236e0 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20  . Also free the 
236f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
23700 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  * structure itse
23710 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65  lf, using sqlite
23720 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  3DbFree()..**.**
23730 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
23740 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20 55  s used to free U
23750 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
23760 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74  ructures allocat
23770 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62  ed by.** the vdb
23780 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20  eUnpackRecord() 
23790 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
237a0 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a  n vdbeapi.c..*/.
237b0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
237c0 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c  FreeUnpacked(sql
237d0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
237e0 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65  ield, UnpackedRe
237f0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
23800 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
23810 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23820 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
23830 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
23840 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20  p->aMem[i];.    
23850 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c    if( pMem->zMal
23860 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
23870 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
23880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
23890 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
238a0 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   p);.  }.}.#endi
238b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
238c0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
238d0 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  K */..#ifdef SQL
238e0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
238f0 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
23900 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
23910 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
23920 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
23930 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75   or DELETE pre-u
23940 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74  pdate call,.** t
23950 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65  hen cursor passe
23960 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23970 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
23980 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77  point to the row
23990 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20   about.** to be 
239a0 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
239b0 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  d. If the applic
239c0 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ation calls sqli
239d0 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
239e0 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75  d(),.** the requ
239f0 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ired value will 
23a00 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
23a10 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20   row the cursor 
23a20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f  points to..*/.vo
23a30 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
23a40 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56  eUpdateHook(.  V
23a50 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a70 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74  * Vdbe pre-updat
23a80 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e hook is invoke
23a90 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75  d by */.  VdbeCu
23aa0 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
23ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
23ac0 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e  sor to grab old.
23ad0 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f  * values from */
23ae0 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53     /* SQLITE_INS
23b10 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
23b20 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  ELETE */.  const
23b30 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
23b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
23b50 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
23b60 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62   /* Modified tab
23b90 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  le */.  i64 iKey
23ba0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
23bb0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
23bc0 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  al key value */.
23bd0 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
23c00 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a  r new.* record *
23c10 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23c20 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36  db = v->db;.  i6
23c30 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70  4 iKey2;.  PreUp
23c40 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a  date preupdate;.
23c50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
23c60 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl = pTab->zName
23c70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
23c80 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65   u8 fakeSortOrde
23c90 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
23ca0 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
23cb0 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
23cc0 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73  &preupdate, 0, s
23cd0 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29  izeof(PreUpdate)
23ce0 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69  );.  if( HasRowi
23cf0 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  d(pTab)==0 ){.  
23d00 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20    iKey1 = iKey2 
23d10 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61  = 0;.    preupda
23d20 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  te.pPk = sqlite3
23d30 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
23d40 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
23d50 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
23d60 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
23d70 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d     iKey2 = v->aM
23d80 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20  em[iReg].u.i;.  
23d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
23da0 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key2 = iKey1;.  
23db0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
23dc0 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  t( pCsr->nField=
23dd0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20  =pTab->nCol .   
23de0 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46      || (pCsr->nF
23df0 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
23e00 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  +1 && op==SQLITE
23e10 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d  _DELETE && iReg=
23e20 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65  =-1).  );..  pre
23e30 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20  update.v = v;.  
23e40 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d  preupdate.pCsr =
23e50 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61   pCsr;.  preupda
23e60 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72  te.op = op;.  pr
23e70 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20  eupdate.iNewReg 
23e80 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64  = iReg;.  preupd
23e90 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d  ate.keyinfo.db =
23ea0 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65   db;.  preupdate
23eb0 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45  .keyinfo.enc = E
23ec0 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64  NC(db);.  preupd
23ed0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65  ate.keyinfo.nFie
23ee0 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ld = pTab->nCol;
23ef0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23f00 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20  info.aSortOrder 
23f10 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74  = (u8*)&fakeSort
23f20 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61  Order;.  preupda
23f30 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31  te.iKey1 = iKey1
23f40 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b  ;.  preupdate.iK
23f50 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70  ey2 = iKey2;.  p
23f60 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20  reupdate.pTab = 
23f70 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72  pTab;..  db->pPr
23f80 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70  eUpdate = &preup
23f90 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65  date;.  db->xPre
23fa0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
23fb0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
23fc0 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  , db, op, zDb, z
23fd0 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79  Tbl, iKey1, iKey
23fe0 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  2);.  db->pPreUp
23ff0 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  date = 0;.  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 52 65 63 6f 72 64 29  eupdate.aRecord)
24020 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
24030 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
24040 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c  te.keyinfo.nFiel
24050 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
24060 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62  Unpacked);.  vdb
24070 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62  eFreeUnpacked(db
24080 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69  , preupdate.keyi
24090 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31 2c 20 70 72  nfo.nField+1, pr
240a0 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61  eupdate.pNewUnpa
240b0 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65  cked);.  if( pre
240c0 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20  update.aNew ){. 
240d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
240e0 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
240f0 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
24100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
24110 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64  mRelease(&preupd
24120 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20  ate.aNew[i]);.  
24130 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
24140 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72 65 75  bFreeNN(db, preu
24150 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d  pdate.aNew);.  }
24160 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
24170 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
24180 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a           DATE_HOOK */.