/ Hex Artifact Content
Login

Artifact d7c7a57f59dc22c05e9a16177615f604fe73588b0ebdc84b540ba5efe3ada430:


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 69 6e 74 20 6e 3b 0a 20 20  mn){.  int n;.  
10000 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
10010 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  >db;..  if( p->n
10020 52 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ResColumn ){.   
10030 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
10040 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
10050 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
10060 41 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69  AME_N);.    sqli
10070 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10080 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a  >aColName);.  }.
10090 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
100a0 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
100b0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
100c0 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
100d0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28   p->aColName = (
100e0 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
100f0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
10100 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
10110 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
10120 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10130 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
10140 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c  aColName, n, db,
10150 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f   MEM_Null);.}../
10160 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
10170 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
10180 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
10190 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
101a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
101b0 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
101c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
101d0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
101e0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
101f0 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
10200 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
10210 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
10220 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  mCols()..**.** T
10230 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
10240 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62  er, xDel, must b
10250 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
10260 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f  DYNAMIC, SQLITE_
10270 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c  STATIC.** or SQL
10280 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49  ITE_TRANSIENT. I
10290 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44  f it is SQLITE_D
102a0 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65  YNAMIC, then the
102b0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
102c0 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77  ** to by zName w
102d0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
102e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20  sqlite3DbFree() 
102f0 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
10300 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69   destroyed..*/.i
10310 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
10320 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65  tColName(.  Vdbe
10330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10350 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69  Vdbe being confi
10360 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  gured */.  int i
10370 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
10380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10390 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a  ndex of column z
103a0 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  Name applies to 
103b0 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20  */.  int var,   
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
103e0 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f  the COLNAME_* co
103f0 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  nstants */.  con
10400 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10420 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
10430 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61  er containing na
10440 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  me */.  void (*x
10450 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20  Del)(void*)     
10460 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
10470 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74  ry management st
10480 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65  rategy for zName
10490 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
104a0 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
104b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
104c0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
104d0 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
104e0 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
104f0 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
10500 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
10510 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78  ert( !zName || x
10520 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del!=SQLITE_DYNA
10530 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  MIC );.    retur
10540 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
10550 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
10560 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
10570 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
10580 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
10590 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
105a0 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
105b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
105c0 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
105d0 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
105e0 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
105f0 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
10600 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
10610 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
10620 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
10630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10640 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
10650 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
10660 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
10670 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
10680 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
10690 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
106a0 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
106b0 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
106c0 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
106d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
106e0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
106f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
10700 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10710 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
10720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10730 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
10740 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
10750 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
10760 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
10770 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
10780 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
10790 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
107a0 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
107b0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63     ** that are c
107e0 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20  andidates for a 
107f0 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
10800 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20   using a.       
10810 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
10820 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  aster-journal */
10830 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10840 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
10850 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
10860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10870 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10880 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
10890 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
108a0 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
108b0 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
108c0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
108d0 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
108e0 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
108f0 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
10900 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
10910 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
10920 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
10930 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
10940 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
10950 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
10960 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
10970 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
10980 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
10990 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
109a0 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
109b0 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
109c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
109d0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
109e0 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
109f0 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
10a00 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
10a10 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
10a20 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
10a30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10a40 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
10a50 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
10a60 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
10a70 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
10a80 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
10a90 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
10aa0 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
10ab0 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
10ac0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
10ad0 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
10ae0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
10af0 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
10b00 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
10b10 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
10b20 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
10b30 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
10b40 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
10b50 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
10b60 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
10b70 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
10b80 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
10b90 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
10ba0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
10bb0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
10bc0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10bd0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10be0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10bf0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10c00 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
10c10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ){.      /* Whet
10c20 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74  her or not a dat
10c30 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64  abase might need
10c40 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10c50 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20  l depends upon. 
10c60 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72       ** its jour
10c70 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20  nal mode (among 
10c80 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20  other things).  
10c90 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65  This matrix dete
10ca0 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20  rmines which.   
10cb0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f     ** journal mo
10cc0 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72  des use a master
10cd0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69   journal and whi
10ce0 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20  ch do not */.   
10cf0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
10d00 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d  u8 aMJNeeded[] =
10d10 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45   {.        /* DE
10d20 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20  LETE   */  1,.  
10d30 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54        /* PERSIST
10d40 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20     */ 1,.       
10d50 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f   /* OFF       */
10d60 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   0,.        /* T
10d70 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20  RUNCATE  */ 1,. 
10d80 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59         /* MEMORY
10d90 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
10da0 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a    /* WAL       *
10db0 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  / 0.      };.   
10dc0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
10dd0 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73  ;   /* Pager ass
10de0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74  ociated with pBt
10df0 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63   */.      needXc
10e00 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10e20 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  er(pBt);.      p
10e30 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
10e40 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
10e50 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
10e60 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[i].safety_leve
10e70 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l!=PAGER_SYNCHRO
10e80 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20  NOUS_OFF.       
10e90 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c  && aMJNeeded[sql
10ea0 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72  ite3PagerGetJour
10eb0 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d  nalMode(pPager)]
10ec0 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20  .      ){ .     
10ed0 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20     assert( i!=1 
10ee0 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e  );.        nTran
10ef0 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s++;.      }.   
10f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10f10 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
10f20 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
10f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10f40 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ve(pBt);.    }. 
10f50 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
10f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10f70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10f80 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10f90 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
10fa0 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
10fb0 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
10fc0 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
10fd0 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
10fe0 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
10ff0 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
11000 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
11010 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
11020 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
11030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11040 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11050 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
11060 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
11070 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
11080 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
11090 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
110a0 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
110b0 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
110c0 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
110d0 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
110e0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
110f0 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
11100 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
11110 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
11120 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
11130 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11140 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
11150 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
11160 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
11170 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
11180 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
11190 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
111a0 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
111b0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
111c0 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
111d0 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
111e0 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
111f0 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
11200 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
11210 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
11220 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
11230 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
11240 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
11250 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
11260 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
11270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
11280 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
11290 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
112a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
112b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
112c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
112d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
112e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
112f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11300 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
11310 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
11320 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
11330 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
11340 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
11350 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
11360 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
11370 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
11380 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
11390 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
113a0 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
113b0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
113c0 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
113d0 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
113e0 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
113f0 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
11400 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
11410 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
11420 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
11430 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
11440 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11450 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11460 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11470 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11480 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11490 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
114a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
114b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
114c0 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
114d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
114e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
114f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11500 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
11510 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
11520 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
11530 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
11540 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
11550 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
11560 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
11570 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
11580 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11590 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
115a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
115b0 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
115c0 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  ically..  */.#if
115d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
115e0 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
115f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
11600 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
11610 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
11620 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
11630 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
11640 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
11650 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
11660 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
11670 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11680 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
11690 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
116a0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
116b0 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
116c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
116d0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
116e0 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
116f0 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
11700 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
11710 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11720 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
11730 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
11740 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11750 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
11760 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
11770 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
11780 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
11790 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
117a0 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
117b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
117c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f  MEM_BKPT;.    do
117d0 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
117e0 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
117f0 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
11800 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
11810 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
11820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
11830 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
11840 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
11850 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11860 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
11870 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11880 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
11890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
118a0 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
118b0 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
118c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
118d0 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
118e0 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
118f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11900 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11910 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
11920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
11930 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
11940 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
11950 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
11960 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
11970 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
11980 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
11990 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
119c0 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
119d0 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
119e0 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
119f0 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
11a00 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
11a10 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
11a20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
11a30 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
11a40 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
11a50 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
11a60 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
11a70 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
11a80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
11a90 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
11aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
11ab0 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
11ac0 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
11ad0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11ae0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
11af0 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
11b00 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
11b10 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
11b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11b30 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
11b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11b50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
11b60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11b70 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
11b80 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
11b90 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
11ba0 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
11bb0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
11bc0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11bd0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
11be0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
11bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11c00 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
11c10 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
11c20 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
11c30 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
11c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11c50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11c60 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11c70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11c80 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
11c90 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
11ca0 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
11cb0 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
11cc0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
11cd0 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
11ce0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
11cf0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11d00 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
11d10 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
11d20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11d30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11d40 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
11d50 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
11d60 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
11d70 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
11d80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11d90 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
11da0 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
11db0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
11dc0 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
11dd0 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
11de0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11df0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
11e00 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
11e10 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11e20 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11e30 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
11e40 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
11e50 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
11e60 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
11e70 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
11e80 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
11e90 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
11ea0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
11eb0 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
11ec0 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
11ed0 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
11ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
11ef0 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
11f00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
11f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11f20 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
11f30 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
11f40 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
11f50 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
11f60 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
11f70 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
11f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
11f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11fb0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
11fc0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
11fd0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
11fe0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
11ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12000 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
12010 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
12020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12040 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
12050 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
12060 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
12070 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
12080 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
12090 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
120a0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
120b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
120c0 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  ( 0==(sqlite3OsD
120d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
120e0 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
120f0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
12100 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
12110 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
12120 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
12130 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
12140 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
12150 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12160 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
12170 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
12180 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
12190 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
121a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
121b0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
121c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
121d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
121e0 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
121f0 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
12200 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
12210 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
12220 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
12230 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12240 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
12250 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12260 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
12270 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
12280 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
12290 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
122a0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
122b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
122c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
122d0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
122e0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
122f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12300 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
12310 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
12320 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
12330 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
12340 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
12350 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
12360 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
12370 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
12380 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12390 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
123a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
123b0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
123c0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
123d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
123e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
123f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
12400 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
12410 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12420 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
12430 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12440 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
12450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12460 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12470 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
12480 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
12490 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
124a0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
124b0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
124c0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
124d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
124e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
124f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12500 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12520 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
12530 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
12540 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
12550 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
12560 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
12570 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
12580 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
12590 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
125a0 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
125b0 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
125c0 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
125d0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
125e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
125f0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
12600 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
12610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12620 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
12630 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
12640 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
12670 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
12680 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
12690 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
126a0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
126b0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
126c0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
126d0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
126e0 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
126f0 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
12700 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
12710 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
12720 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
12730 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
12740 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
12750 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
12760 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
12770 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
12780 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
12790 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
127a0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
127b0 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
127c0 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
127d0 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
127e0 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
127f0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
12800 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
12810 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
12820 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
12830 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
12840 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12850 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12860 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
12870 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
12880 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12890 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
128a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
128b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
128c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
128d0 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
128e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
128f0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
12900 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
12910 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
12920 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
12930 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
12940 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
12950 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
12960 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
12970 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
12980 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
12990 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
129a0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
129b0 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
129c0 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
129d0 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
129e0 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
129f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
12a00 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
12a10 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
12a20 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
12a30 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
12a40 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
12a50 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
12a60 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
12a70 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
12a80 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
12a90 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
12aa0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
12ab0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
12ac0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
12ad0 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
12ae0 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
12af0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
12b00 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
12b10 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
12b20 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
12b30 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
12b40 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
12b50 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12b60 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
12b70 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
12b80 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
12b90 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
12ba0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
12bb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
12bc0 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
12bd0 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
12be0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12bf0 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
12c00 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
12c20 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
12c30 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
12c40 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
12c50 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
12c60 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
12c70 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
12c80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
12c90 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
12ca0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
12cb0 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
12cc0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
12cd0 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
12ce0 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
12cf0 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
12d00 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
12d10 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
12d20 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
12d30 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
12d40 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
12d50 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
12d60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
12d70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
12d80 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
12d90 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
12da0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
12db0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
12dc0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
12dd0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
12de0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
12df0 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
12e00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
12e10 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
12e20 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
12e30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
12e40 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65  OINLINE int vdbe
12e50 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
12e60 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
12e70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
12e80 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
12e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12ea0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
12eb0 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
12ec0 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
12ed0 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72  ment-1;..  asser
12ee0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
12ef0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
12f00 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
12f10 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28  EASE);.  assert(
12f20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
12f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12f40 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
12f50 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
12f60 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
12f70 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
12f80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
12f90 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
12fa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65  ITE_OK;.    Btre
12fb0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12fc0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
12fd0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66   pBt ){.      if
12fe0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12ff0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
13000 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
13010 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
13020 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
13030 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
13040 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
13050 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
13060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13070 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13080 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
13090 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
130a0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
130b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
130c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
130d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
130e0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
130f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d  .    }.  }.  db-
13100 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
13110 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
13120 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
13130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13140 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
13150 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13160 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13170 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
13180 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
13190 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
131a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
131b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
131c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
131d0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
131e0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
131f0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
13200 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oint);.    }.  }
13210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
13220 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13230 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
13240 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
13250 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  estore the .  **
13260 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13270 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
13280 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
13290 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
132a0 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65  d when .  ** the
132b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
132c0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
132d0 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70  d.  */.  if( eOp
132e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
132f0 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  BACK ){.    db->
13300 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
13310 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
13320 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
13330 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
13340 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
13350 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13360 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
13370 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
13380 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
13390 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  p){.  if( p->db-
133a0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
133b0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
133c0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
133d0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
133e0 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74   eOp);.  }.  ret
133f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13400 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
13410 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13420 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
13430 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
13440 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
13450 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
13460 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
13470 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
13480 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
13490 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
134a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
134b0 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
134c0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
134d0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
134e0 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
134f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
13500 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
13510 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
13520 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
13530 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
13540 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
13550 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
13560 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
13570 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
13580 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
13590 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
135a0 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
135b0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
135c0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
135d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
135e0 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
135f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
13600 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
13610 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
13620 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
13630 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
13640 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
13650 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
13660 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
13670 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
13680 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
13690 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
136a0 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
136b0 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
136c0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
136d0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
136e0 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
136f0 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
13700 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
13710 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f  VdbeError(p, "FO
13720 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
13730 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
13740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13750 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13770 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13790 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
137a0 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
137b0 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
137c0 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
137d0 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
137e0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
137f0 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
13800 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
13810 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
13820 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
13830 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
13840 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13850 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
13860 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
13870 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
13880 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
13890 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
138a0 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
138b0 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
138c0 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
138d0 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
138e0 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
138f0 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
13900 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
13910 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
13920 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
13930 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
13940 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
13950 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
13960 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
13970 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13980 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
13990 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
139a0 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
139b0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
139c0 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
139d0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
139e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
139f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13a10 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
13a20 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
13a30 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
13a40 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
13a50 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
13a60 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
13a70 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
13a80 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
13a90 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
13aa0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
13ab0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
13ac0 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
13ad0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
13ae0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
13af0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
13b00 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
13b10 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
13b20 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
13b30 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
13b40 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
13b50 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
13b60 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
13b70 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
13b80 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
13b90 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
13ba0 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
13bb0 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
13bc0 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
13bd0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
13be0 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
13bf0 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
13c00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
13c10 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
13c20 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
13c30 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
13c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
13c50 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
13c60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13c70 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
13c80 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
13c90 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
13ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13cb0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
13cc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13cd0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
13ce0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13cf0 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
13d00 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41  ors(p);.  checkA
13d10 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
13d20 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
13d30 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
13d40 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
13d50 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
13d60 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
13d70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
13d80 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
13d90 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
13da0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
13db0 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
13dc0 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
13dd0 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
13de0 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
13df0 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
13e00 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
13e10 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
13e20 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
13e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13e40 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
13e50 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
13e60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
13e70 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
13e80 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
13e90 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
13ea0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
13eb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
13ec0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13ed0 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
13ee0 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
13ef0 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
13f00 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
13f10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
13f20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
13f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f40 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
13f50 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
13f60 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
13f70 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
13f80 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
13f90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
13fa0 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
13fb0 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  y and the error 
13fc0 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49  code is SQLITE_I
13fd0 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20  NTERRUPT, .     
13fe0 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   ** no rollback 
13ff0 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74  is necessary. Ot
14000 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73  herwise, at leas
14010 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  t a savepoint . 
14020 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
14030 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  ion must be roll
14040 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f  ed back to resto
14050 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
14060 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  to a .      ** c
14070 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
14080 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
14090 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73  ** Even if the s
140a0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64  tatement is read
140b0 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70  -only, it is imp
140c0 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72  ortant to perfor
140d0 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61  m.      ** a sta
140e0 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
140f0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f  ction rollback o
14100 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
14110 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a   error .      **
14120 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
14130 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
14140 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
14150 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
14160 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
14170 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
14180 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
14190 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
141a0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
141b0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
141c0 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
141d0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
141e0 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
141f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
14200 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
14210 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
14220 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
14230 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
14240 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
14250 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
14260 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
14270 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
14280 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
14290 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
142a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
142b0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
142c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
142d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
142e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
142f0 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
14300 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
14310 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
14320 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
14330 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
14340 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
14350 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
14360 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
14370 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
14380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14390 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
143a0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
143b0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
143c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
143d0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
143e0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
143f0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14400 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
14410 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
14440 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
14450 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
14460 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
14470 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14490 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
144a0 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
144b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
144c0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
144d0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
144e0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
144f0 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
14500 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
14510 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
14520 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
14530 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
14540 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
14550 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
14560 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
14570 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
14580 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
14590 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
145a0 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
145b0 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
145c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
145d0 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
145e0 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
145f0 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
14600 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
14610 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
14620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
14630 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14640 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
14650 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
14660 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
14670 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
14680 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
14690 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
146a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
146b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
146c0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
146d0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
146e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
146f0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
14700 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14710 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14730 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14740 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
14750 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
14760 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
14770 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
14780 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
14790 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
147a0 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
147b0 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
147c0 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
147d0 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
147e0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
147f0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
14800 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
14810 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
14820 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
14830 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
14840 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
14850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
14860 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
14870 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
14880 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
14890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
148a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
148b0 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
148c0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
148d0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
148e0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
148f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14900 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
14910 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
14920 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
14930 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
14940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14950 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14960 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
14970 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14980 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
14990 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
149a0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
149b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
149c0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
149d0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
149e0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
149f0 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
14a00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14a10 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
14a20 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
14a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
14a40 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14a50 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
14a60 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
14a70 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14a80 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14a90 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
14aa0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
14ab0 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
14ac0 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
14ad0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14ae0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
14af0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
14b00 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
14b10 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
14b20 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
14b30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
14b40 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14b50 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
14b60 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
14b70 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14b80 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
14b90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14ba0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14bb0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14bc0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14bd0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14be0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14bf0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14c00 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
14c10 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14c30 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
14c40 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
14c50 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
14c60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14c70 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
14c80 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
14c90 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
14ca0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
14cb0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
14cc0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
14cd0 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
14ce0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
14cf0 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
14d00 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
14d10 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
14d20 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
14d30 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14d40 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
14d50 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
14d60 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
14d70 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
14d80 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
14d90 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
14da0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
14db0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
14dc0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
14dd0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14de0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
14df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14e00 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
14e10 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
14e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14e30 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
14e40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14e50 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
14e70 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
14e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
14e90 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14ea0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
14eb0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
14ec0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
14ed0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
14ee0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
14ef0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
14f00 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14f10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14f20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
14f30 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
14f40 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
14f50 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
14f60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14f70 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
14f80 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
14f90 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
14fa0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
14fb0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
14fc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
14fd0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
14fe0 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
14ff0 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
15000 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
15010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15020 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
15030 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
15040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15050 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
15060 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
15070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
15080 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15090 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
150a0 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
150b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
150c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
150d0 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
150e0 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
150f0 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
15100 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
15110 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
15120 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
15130 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
15140 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
15150 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
15160 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
15170 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
15180 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
15190 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
151a0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
151b0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
151c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
151d0 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
151e0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
151f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
15200 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
15210 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
15220 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
15230 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
15240 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
15250 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15260 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
15270 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
15280 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
15290 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
152a0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
152b0 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
152c0 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
152d0 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
152e0 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
152f0 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
15300 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
15310 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
15320 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
15330 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
15340 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
15350 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
15360 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
15370 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
15380 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
15390 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
153a0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
153b0 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d  eActive>0 || db-
153c0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
153d0 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  | db->nStatement
153e0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
153f0 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42  (p->rc==SQLITE_B
15400 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  USY ? SQLITE_BUS
15410 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  Y : SQLITE_OK);.
15420 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
15430 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
15440 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
15450 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
15460 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
15470 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
15480 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
15490 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
154a0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
154b0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
154c0 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
154d0 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
154e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
154f0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65  /*.** Copy the e
15500 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
15510 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f  ror message belo
15520 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42  nging to the VDB
15530 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  E passed.** as t
15540 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15550 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73  t to its databas
15560 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61  e handle (so tha
15570 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a  t they will be .
15580 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63  ** returned by c
15590 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
155a0 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71  errcode() and sq
155b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e  lite3_errmsg()).
155c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
155d0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c  tion does not cl
155e0 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72  ear the VDBE err
155f0 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61  or code or messa
15600 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69  ge, just.** copi
15610 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64  es them to the d
15620 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
15630 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15640 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
15650 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
15660 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
15670 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
15680 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  c;.  if( p->zErr
15690 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62  Msg ){.    db->b
156a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a  BenignMalloc++;.
156b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
156c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
156d0 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72      if( db->pErr
156e0 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d  ==0 ) db->pErr =
156f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
15700 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
15710 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
15720 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
15730 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
15740 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
15750 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
15760 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
15770 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65  c();.    db->bBe
15780 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20  nignMalloc--;.  
15790 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 70 45  }else if( db->pE
157a0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
157b0 33 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62  3ValueSetNull(db
157c0 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64  ->pErr);.  }.  d
157d0 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
157e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
157f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15800 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
15810 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
15820 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
15830 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
15840 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
15850 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
15860 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
15870 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
15880 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
15890 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
158a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
158b0 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
158c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
158d0 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
158e0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
158f0 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
15900 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
15910 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
15920 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
15930 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
15940 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
15950 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15960 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
15970 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
15980 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15990 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
159a0 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
159b0 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
159c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
159d0 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
159e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
159f0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
15a00 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
15a10 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
15a20 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
15a30 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
15a40 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
15a50 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
15a60 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
15a70 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
15a80 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
15a90 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
15aa0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
15ab0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
15ac0 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
15ad0 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
15ae0 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
15af0 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
15b00 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
15b10 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
15b20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
15b30 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
15b40 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
15b50 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
15b60 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
15b70 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
15b80 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
15b90 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
15ba0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
15bb0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
15bc0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
15bd0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
15be0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
15bf0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
15c00 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
15c10 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
15c20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
15c30 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
15c40 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
15c50 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
15c60 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
15c70 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
15c80 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
15c90 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
15ca0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
15cb0 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
15cc0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
15cd0 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
15ce0 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
15cf0 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
15d00 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
15d10 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
15d20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
15d30 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
15d40 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
15d50 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
15d60 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
15d70 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
15d80 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
15d90 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
15da0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
15db0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
15dc0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
15dd0 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
15de0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15df0 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
15e00 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
15e10 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
15e20 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
15e30 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
15e40 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
15e50 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
15e60 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
15e70 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
15e80 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
15e90 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
15ea0 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
15eb0 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
15ec0 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
15ed0 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
15ee0 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
15ef0 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
15f00 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
15f10 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
15f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
15f30 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
15f40 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
15f50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15f60 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
15f70 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
15f80 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
15f90 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
15fa0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
15fb0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
15fc0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
15fd0 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
15fe0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
15ff0 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
16000 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
16010 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
16020 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
16030 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
16040 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
16050 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
16060 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
16070 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
16080 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
16090 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
160a0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
160b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
160c0 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
160d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
160e0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
160f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
16100 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
16110 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
16120 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
16130 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
16140 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
16150 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
16160 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
16170 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
16180 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
16190 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
161a0 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
161b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
161c0 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
161d0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
161e0 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
161f0 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
16200 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
16210 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16220 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
16230 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
16240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
16250 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
16260 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
16270 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
16280 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
16290 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
162a0 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
162b0 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
162c0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
162d0 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
162e0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
162f0 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
16300 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
16310 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
16320 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
16330 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
16340 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
16350 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
16360 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
16370 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
16380 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
16390 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
163a0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
163b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
163c0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
163d0 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20  E_MAGIC_RESET;. 
163e0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
163f0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
16400 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
16410 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
16420 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
16430 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
16440 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
16450 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
16460 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
16470 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
16480 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
16490 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
164a0 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
164b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
164c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
164d0 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
164e0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
164f0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
16500 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
16510 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
16520 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
16530 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
16540 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
16550 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
16560 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
16570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16580 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16590 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
165a0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
165b0 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
165c0 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
165d0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
165e0 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
165f0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
16600 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
16610 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
16620 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
16630 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
16640 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
16650 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
16660 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
16670 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
16680 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
16690 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
166a0 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
166b0 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
166c0 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
166d0 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
166e0 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
166f0 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
16700 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
16710 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
16720 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
16730 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
16740 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
16750 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
16760 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
16770 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
16780 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
16790 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
167a0 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
167b0 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
167c0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
167d0 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
167e0 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73  parameter corres
167f0 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65  ponds to bit 0 e
16800 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tc.)..*/.void sq
16810 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
16820 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a  uxData(sqlite3 *
16830 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70  db, AuxData **pp
16840 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
16850 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a  ask){.  while( *
16860 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
16870 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
16880 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
16890 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41      || (pAux->iA
168a0 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20  uxOp==iOp.      
168b0 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75      && pAux->iAu
168c0 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20  xArg>=0.        
168d0 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78    && (pAux->iAux
168e0 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
168f0 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
16900 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20  x->iAuxArg)))). 
16910 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
16920 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78  case( pAux->iAux
16930 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
16940 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
16950 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20  teAux ){.       
16960 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75   pAux->xDeleteAu
16970 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  x(pAux->pAux);. 
16980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
16990 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75   = pAux->pNextAu
169a0 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  x;.      sqlite3
169b0 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29  DbFree(db, pAux)
169c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
169d0 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
169e0 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20  extAux;.    }.  
169f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
16a00 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
16a10 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
16a20 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
16a30 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
16a40 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72  t,.** except for
16a50 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20   object itself, 
16a60 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76  which is preserv
16a70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ed..**.** The di
16a80 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
16a90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
16aa0 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
16ab0 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
16ac0 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
16ad0 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
16ae0 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
16af0 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
16b00 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
16b10 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16b20 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74  tion and frees t
16b30 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  he object itself
16b40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16b50 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
16b60 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
16b70 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
16b80 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
16b90 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  xt;.  assert( p-
16ba0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
16bb0 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
16bc0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
16bd0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
16be0 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
16bf0 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
16c00 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
16c10 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
16c20 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
16c30 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
16c40 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
16c50 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
16c60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
16c70 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
16c80 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67    }.  if( p->mag
16c90 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
16ca0 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  NIT ){.    relea
16cb0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
16cc0 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
16cd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16ce0 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a  db, p->pVList);.
16cf0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16d00 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
16d10 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f  .  }.  vdbeFreeO
16d20 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
16d30 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
16d40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16d50 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
16d60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16d70 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64  , p->zSql);.#ifd
16d80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16d90 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
16da0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
16db0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16dc0 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
16dd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16de0 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
16df0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
16e00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16e10 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
16e20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
16e30 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
16e40 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
16e50 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16e60 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
16e70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16e80 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
16e90 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
16ea0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
16eb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16ec0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
16ed0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  x) );.  sqlite3V
16ee0 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64  dbeClearObject(d
16ef0 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, p);.  if( p->
16f00 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
16f10 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
16f20 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
16f30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
16f40 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
16f50 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
16f60 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
16f70 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
16f80 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
16f90 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
16fa0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
16fb0 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
16fc0 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
16fd0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
16fe0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
16ff0 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
17000 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
17010 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
17020 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
17030 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
17040 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
17050 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
17060 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
17070 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
17080 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
17090 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
170a0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
170b0 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
170c0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
170d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
170e0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
170f0 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
17100 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
17110 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
17120 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
17130 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
17140 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
17150 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
17160 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
17170 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
17180 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17190 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
171a0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
171b0 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
171c0 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
171d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
171e0 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
171f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
17200 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
17220 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
17230 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
17240 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
17250 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
17260 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
17270 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
17280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
172a0 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
172b0 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
172c0 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
172d0 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
172e0 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
172f0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
17300 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
17310 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
17320 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
17330 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
17340 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
17350 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
17360 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
17370 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
17380 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
17390 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
173a0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
173b0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
173c0 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
173d0 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
173e0 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
173f0 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
17400 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
17410 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
17420 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
17430 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
17440 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
17450 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17460 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
17470 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  ( p->uc.pCursor!
17480 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17490 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
174a0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
174b0 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72  .pCursor) );.  r
174c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
174d0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d  CursorRestore(p-
174e0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73  >uc.pCursor, &is
174f0 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20  DifferentRow);. 
17500 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
17510 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
17520 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74   if( isDifferent
17530 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77  Row ) p->nullRow
17540 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
17550 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
17560 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  k to ensure that
17570 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
17580 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74  alid.  Restore t
17590 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20  he cursor.** if 
175a0 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e  need be.  Return
175b0 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66   any I/O error f
175c0 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20  rom the restore 
175d0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  operation..*/.in
175e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
175f0 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43  sorRestore(VdbeC
17600 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
17610 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
17620 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
17630 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17640 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
17650 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
17660 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
17670 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
17680 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
17690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
176a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
176b0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
176c0 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
176d0 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
176e0 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
176f0 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
17700 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
17710 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
17720 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
17730 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
17740 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
17750 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
17760 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
17770 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
17780 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
17790 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
177a0 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
177b0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
177c0 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
177d0 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
177e0 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
177f0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
17800 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
17810 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
17820 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
17830 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
17840 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
17850 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
17860 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
17870 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
17880 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
17890 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
178a0 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
178b0 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
178c0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
178d0 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
178e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
178f0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
17900 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
17910 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
17920 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69  or **pp, int *pi
17930 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73  Col){.  VdbeCurs
17940 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69  or *p = *pp;.  i
17950 66 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  f( p->eCurType==
17960 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b  CURTYPE_BTREE ){
17970 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65  .    if( p->defe
17980 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
17990 20 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20      int iMap;.  
179a0 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d      if( p->aAltM
179b0 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d  ap && (iMap = p-
179c0 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f  >aAltMap[1+*piCo
179d0 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  l])>0 ){.       
179e0 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75   *pp = p->pAltCu
179f0 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a 70  rsor;.        *p
17a00 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b  iCol = iMap - 1;
17a10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
17a30 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
17a40 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
17a50 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20  veto(p);.    }. 
17a60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
17a70 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
17a80 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
17a90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17aa0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
17ab0 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  or(p);.    }.  }
17ac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17ad0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
17ae0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
17af0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
17b00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17b10 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
17b20 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
17b30 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
17b40 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
17b50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17b60 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
17b70 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
17b80 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
17b90 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
17ba0 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
17bb0 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
17bc0 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
17bd0 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
17be0 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
17bf0 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
17c00 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
17c10 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
17c20 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
17c30 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
17c40 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
17c50 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
17c60 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
17c70 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
17c80 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
17c90 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
17ca0 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
17cb0 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
17cc0 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
17cd0 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
17ce0 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
17cf0 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
17d00 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
17d10 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
17d20 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17d30 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
17d40 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
17d50 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
17d60 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
17d70 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
17d80 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
17d90 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
17da0 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
17db0 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
17dc0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
17dd0 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
17de0 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
17df0 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
17e00 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
17e10 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
17e20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
17e30 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
17e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
17e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17e60 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17e70 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
17ea0 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
17ed0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17ee0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
17ef0 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
17f00 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17f10 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
17f40 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
17f50 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
17f70 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17f80 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17f90 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
17fa0 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
17fb0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17fc0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17ff0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
18000 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
18020 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
18030 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
18060 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
18070 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
180a0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
180b0 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
180e0 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
180f0 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
18100 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
18110 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
18120 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
18130 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
18140 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
18150 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
18160 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
18170 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
18180 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
18190 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
181a0 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
181b0 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
181c0 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
181d0 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
181e0 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
181f0 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
18200 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
18210 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
18220 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
18230 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
18240 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20  ile_format, u32 
18250 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c  *pLen){.  int fl
18260 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
18270 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61  s;.  u32 n;..  a
18280 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29  ssert( pLen!=0 )
18290 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ;.  if( flags&ME
182a0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Null ){.    *p
182b0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Len = 0;.    ret
182c0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
182d0 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
182e0 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
182f0 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
18300 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
18310 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
18320 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
18330 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
18340 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
18350 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
18360 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
18370 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
18380 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
18390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
183a0 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
183b0 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
183c0 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20     if( (i&1)==i 
183d0 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
183e0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  4 ){.        *pL
183f0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
18400 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b  return 8+(u32)u;
18410 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18420 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b        *pLen = 1;
18430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18440 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
18450 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
18460 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20  7 ){ *pLen = 2; 
18470 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20  return 2; }.    
18480 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
18490 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74  { *pLen = 3; ret
184a0 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28  urn 3; }.    if(
184b0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
184c0 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74  { *pLen = 4; ret
184d0 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28  urn 4; }.    if(
184e0 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b   u<=MAX_6BYTE ){
184f0 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75   *pLen = 6; retu
18500 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65  rn 5; }.    *pLe
18510 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
18520 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
18530 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
18540 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
18550 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
18560 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
18570 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
18580 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
18590 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
185a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
185b0 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
185c0 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
185d0 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
185e0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
185f0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
18600 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b    }.  *pLen = n;
18610 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
18620 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
18630 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
18640 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
18650 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70  s for serial typ
18660 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  es less than 128
18670 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
18680 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   u8 sqlite3Small
18690 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a  TypeSizes[] = {.
186a0 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20          /*  0   
186b0 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20  1   2   3   4   
186c0 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20  5   6   7   8   
186d0 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a  9 */   ./*   0 *
186e0 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20  /   0,  1,  2,  
186f0 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20  3,  4,  6,  8,  
18700 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31  8,  0,  0,./*  1
18710 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  0 */   0,  0,  0
18720 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32  ,  0,  1,  1,  2
18730 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a  ,  2,  3,  3,./*
18740 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c    20 */   4,  4,
18750 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c    5,  5,  6,  6,
18760 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c    7,  7,  8,  8,
18770 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20  ./*  30 */   9, 
18780 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20   9, 10, 10, 11, 
18790 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20  11, 12, 12, 13, 
187a0 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31  13,./*  40 */  1
187b0 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31  4, 14, 15, 15, 1
187c0 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31  6, 16, 17, 17, 1
187d0 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f  8, 18,./*  50 */
187e0 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30    19, 19, 20, 20
187f0 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32  , 21, 21, 22, 22
18800 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30  , 23, 23,./*  60
18810 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c   */  24, 24, 25,
18820 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c   25, 26, 26, 27,
18830 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20   27, 28, 28,./* 
18840 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20   70 */  29, 29, 
18850 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20  30, 30, 31, 31, 
18860 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a  32, 32, 33, 33,.
18870 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33  /*  80 */  34, 3
18880 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33  4, 35, 35, 36, 3
18890 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33  6, 37, 37, 38, 3
188a0 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39  8,./*  90 */  39
188b0 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31  , 39, 40, 40, 41
188c0 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33  , 41, 42, 42, 43
188d0 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20  , 43,./* 100 */ 
188e0 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c   44, 44, 45, 45,
188f0 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c   46, 46, 47, 47,
18900 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20   48, 48,./* 110 
18910 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20  */  49, 49, 50, 
18920 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20  50, 51, 51, 52, 
18930 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31  52, 53, 53,./* 1
18940 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35  20 */  54, 54, 5
18950 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35  5, 55, 56, 56, 5
18960 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  7, 57.};../*.** 
18970 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
18980 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
18990 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
189a0 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
189b0 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
189c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
189d0 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
189e0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
189f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
18a00 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  8 ){.    return 
18a10 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
18a20 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
18a30 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
18a40 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20  type<12 .       
18a50 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
18a60 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
18a70 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72  rial_type]==(ser
18a80 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32  ial_type - 12)/2
18a90 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   );.    return s
18aa0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18ab0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18ac0 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69  ];.  }.}.u8 sqli
18ad0 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
18ae0 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73  rialTypeLen(u8 s
18af0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61  erial_type){.  a
18b00 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
18b10 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75  pe<128 );.  retu
18b20 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
18b30 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
18b40 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  type];  .}../*.*
18b50 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
18b60 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
18b70 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
18b80 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
18b90 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
18ba0 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
18bb0 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
18bc0 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
18bd0 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
18be0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
18bf0 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
18c00 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
18c10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
18c20 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
18c30 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
18c40 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
18c50 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
18c60 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
18c70 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
18c80 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
18c90 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
18ca0 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
18cb0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
18cc0 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
18cd0 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
18ce0 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
18cf0 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
18d00 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
18d10 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
18d20 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
18d30 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
18d40 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
18d50 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
18d60 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
18d70 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
18d80 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
18d90 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
18da0 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
18db0 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
18dc0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
18dd0 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
18de0 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
18df0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
18e00 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
18e10 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
18e20 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
18e30 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
18e40 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
18e50 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
18e60 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
18e70 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
18e80 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
18e90 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
18ea0 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
18eb0 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
18ec0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
18ed0 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
18ee0 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
18ef0 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
18f00 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
18f10 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
18f20 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
18f30 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
18f40 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
18f50 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
18f60 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
18f70 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
18f80 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
18f90 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
18fa0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
18fb0 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
18fc0 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
18fd0 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
18fe0 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
18ff0 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
19000 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
19010 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
19020 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
19030 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
19040 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
19050 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
19060 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
19070 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
19080 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
19090 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
190a0 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
190b0 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
190c0 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
190d0 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
190e0 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
190f0 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
19100 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
19110 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
19120 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
19130 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
19140 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
19150 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
19160 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
19170 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
19180 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
19190 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
191a0 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
191b0 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
191c0 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
191d0 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
191e0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
191f0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
19200 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
19210 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
19220 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
19230 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
19240 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
19250 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
19260 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
19270 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
19280 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
19290 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
192a0 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
192b0 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
192c0 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
192d0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
192e0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
192f0 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
19300 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
19310 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
19320 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
19330 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
19340 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
19350 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
19360 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
19370 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
19380 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
19390 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
193a0 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
193b0 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
193c0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
193d0 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
193e0 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  ].  The caller i
193f0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a  s responsible.**
19400 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20   for allocating 
19410 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
19420 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68  buf[] to hold th
19430 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20  e entire field, 
19440 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20  exclusive.** of 
19450 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  the pMem->u.nZer
19460 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45  o bytes for a ME
19470 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  M_Zero value..**
19480 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19490 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
194a0 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
194b0 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
194c0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
194d0 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
194e0 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
194f0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
19500 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
19510 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
19520 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
19530 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
19540 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19550 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d  alPut(u8 *buf, M
19560 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65  em *pMem, u32 se
19570 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33  rial_type){.  u3
19580 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
19590 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
195a0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
195b0 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
195c0 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
195d0 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
195e0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
195f0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
19600 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
19610 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
19620 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  u.r) );.      me
19630 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
19640 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  u.r, sizeof(v));
19650 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
19660 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
19670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19680 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
19690 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
196a0 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  i = sqlite3Small
196b0 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
196c0 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65  _type];.    asse
196d0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64  rt( i>0 );.    d
196e0 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69  o{.      buf[--i
196f0 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
19700 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
19710 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29  .    }while( i )
19720 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
19730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
19740 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
19750 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
19760 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
19770 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
19780 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
19790 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
197a0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
197b0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
197c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
197d0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
197e0 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
197f0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28  pMem->n;.    if(
19800 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28   len>0 ) memcpy(
19810 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
19820 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
19830 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
19840 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
19850 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
19860 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
19870 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
19880 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
19890 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
198a0 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
198b0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
198c0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
198d0 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
198e0 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
198f0 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
19900 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
19910 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
19920 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
19930 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
19940 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
19950 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
19960 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
19970 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
19980 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
19990 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
199a0 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
199b0 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
199c0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
199d0 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
199e0 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
199f0 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
19a00 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
19a10 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
19a20 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
19a30 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
19a40 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
19a50 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
19a60 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
19a70 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
19a80 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
19a90 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
19aa0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19ab0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
19ac0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19ad0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
19ae0 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
19af0 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
19b00 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
19b10 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
19b20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
19b30 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
19b40 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
19b50 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
19b60 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
19b70 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
19b80 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
19b90 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
19ba0 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
19bb0 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
19bc0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
19bd0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
19be0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19bf0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
19c00 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
19c10 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
19c20 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
19c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
19c40 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
19c50 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
19c60 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
19c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
19c80 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
19c90 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
19ca0 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
19cb0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
19cc0 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
19cd0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
19ce0 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
19cf0 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
19d00 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
19d10 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19d20 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37  OF: R-29851-5227
19d30 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  2 Value is a big
19d40 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20  -endian 64-bit. 
19d50 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
19d60 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
19d70 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  /.    pMem->u.i 
19d80 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
19d90 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19da0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
19db0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
19dc0 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
19dd0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19de0 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20  : R-57343-49114 
19df0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
19e00 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32  ndian IEEE 754-2
19e10 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  008 64-bit.    *
19e20 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
19e30 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20   number. */.#if 
19e40 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
19e50 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
19e60 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
19e70 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
19e80 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
19e90 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
19ea0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
19eb0 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
19ec0 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
19ed0 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
19ee0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
19ef0 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
19f00 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
19f10 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
19f20 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
19f30 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
19f40 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
19f50 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
19f60 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
19f70 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
19f80 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
19f90 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
19fa0 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
19fb0 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
19fc0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
19fd0 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
19fe0 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
19ff0 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
1a000 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
1a010 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
1a020 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
1a030 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
1a040 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
1a050 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  ->u.r)==8 );.   
1a060 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1a070 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65  Float(x);.    me
1a080 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c  mcpy(&pMem->u.r,
1a090 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
1a0a0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
1a0b0 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
1a0c0 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d  pMem->u.r) ? MEM
1a0d0 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
1a0e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
1a0f0 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
1a100 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
1a110 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1a120 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
1a130 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
1a140 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
1a150 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1a160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a170 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
1a180 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
1a190 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
1a1c0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
1a1d0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
1a1e0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1a1f0 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
1a200 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
1a210 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
1a220 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
1a230 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
1a240 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
1a250 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75  case 0: {  /* Nu
1a260 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ll */.      /* E
1a270 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
1a280 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20  078-09375 Value 
1a290 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  is a NULL. */.  
1a2a0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a2b0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
1a2c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a2d0 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
1a2e0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a2f0 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36  F: R-44885-25196
1a300 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62   Value is an 8-b
1a310 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
1a320 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  nt.      ** inte
1a330 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1a340 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59  em->u.i = ONE_BY
1a350 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1a360 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a370 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a380 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a390 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1a3a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1a3b0 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
1a3c0 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
1a3d0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1a3e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a3f0 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c  -49794-35026 Val
1a400 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1a410 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20  an 16-bit.      
1a420 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1a430 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1a440 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a450 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75   TWO_BYTE_INT(bu
1a460 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a470 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a490 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1a4b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1a4c0 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1a4d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a4e0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a4f0 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34  E-OF: R-37839-54
1a500 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62  301 Value is a b
1a510 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74  ig-endian 24-bit
1a520 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1a530 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a540 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1a550 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59  ->u.i = THREE_BY
1a560 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1a570 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a580 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a590 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a5a0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1a5b0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
1a5c0 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
1a5d0 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
1a5e0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1a5f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a600 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c  -01849-26079 Val
1a610 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1a620 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20  an 32-bit.      
1a630 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1a640 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1a650 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a660 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62   FOUR_BYTE_INT(b
1a670 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50  uf);.#ifdef __HP
1a680 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f  _cc .      /* Wo
1a690 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e  rk around a sign
1a6a0 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69  -extension bug i
1a6b0 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65  n the HP compile
1a6c0 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20  r for HP/UX */. 
1a6d0 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26       if( buf[0]&
1a6e0 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69  0x80 ) pMem->u.i
1a6f0 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30   |= 0xffffffff80
1a700 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66  000000LL;.#endif
1a710 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1a720 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1a730 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1a740 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1a750 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
1a760 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1a770 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1a780 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1a790 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a7a0 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34  F: R-50385-09674
1a7b0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1a7c0 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20  endian 48-bit.  
1a7d0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1a7e0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1a7f0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a800 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
1a810 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
1a820 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1a830 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1a840 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a850 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1a860 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1a870 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1a880 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
1a890 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
1a8a0 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1a8b0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
1a8c0 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
1a8d0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1a8e0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
1a8f0 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
1a900 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
1a910 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
1a920 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
1a930 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
1a940 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
1a950 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
1a960 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
1a970 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
1a980 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
1a990 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
1a9a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1a9b0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
1a9c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
1a9d0 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
1a9e0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a9f0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36  ENCE-OF: R-12976
1aa00 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20  -22893 Value is 
1aa10 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a  the integer 0. *
1aa20 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1aa30 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d  NCE-OF: R-18143-
1aa40 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74  12121 Value is t
1aa50 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f  he integer 1. */
1aa60 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1aa70 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
1aa80 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1aa90 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1aaa0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1aab0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1aac0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1aad0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30  DENCE-OF: R-1460
1aae0 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73  6-31564 Value is
1aaf0 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20   a BLOB that is 
1ab00 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69  (N-12)/2 bytes i
1ab10 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74  n.      ** lengt
1ab20 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  h..      ** EVID
1ab30 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31  ENCE-OF: R-28401
1ab40 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20  -00140 Value is 
1ab50 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
1ab60 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e  text encoding an
1ab70 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33  d.      ** (N-13
1ab80 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  )/2 bytes in len
1ab90 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74  gth. */.      st
1aba0 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
1abb0 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
1abc0 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
1abd0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
1abe0 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   };.      pMem->
1abf0 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
1ac00 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1ac10 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1ac20 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
1ac30 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73  >flags = aFlag[s
1ac40 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20  erial_type&1];. 
1ac50 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d       return pMem
1ac60 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ->n;.    }.  }. 
1ac70 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a   return 0;.}./*.
1ac80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ac90 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
1aca0 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
1acb0 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
1acc0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
1acd0 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
1ace0 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
1acf0 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
1ad00 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
1ad10 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
1ad20 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1ad30 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
1ad40 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
1ad50 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
1ad60 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
1ad70 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
1ad80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1ad90 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
1ada0 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
1adb0 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
1adc0 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
1add0 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
1ade0 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
1adf0 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
1ae00 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
1ae10 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
1ae20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
1ae30 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1ae40 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
1ae50 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
1ae60 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
1ae70 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
1ae80 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
1ae90 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
1aea0 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
1aeb0 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
1aec0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1aed0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
1aee0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
1aef0 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
1af00 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
1af10 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
1af20 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
1af30 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
1af40 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
1af50 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1af60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
1af70 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1af80 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55  record */.){.  U
1af90 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1afa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1afb0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1afc0 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1afd0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aff0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1b000 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
1b010 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d   *p */.  nByte =
1b020 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1b030 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1b040 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1b050 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1b060 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 63  1);.  p = (Unpac
1b070 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
1b080 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
1b090 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
1b0a0 74 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20  te);.  if( !p ) 
1b0b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61  return 0;.  p->a
1b0c0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
1b0d0 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
1b0e0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1b0f0 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
1b100 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1b110 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1b120 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
1b130 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
1b140 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
1b150 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
1b160 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1b170 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
1b180 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
1b190 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
1b1a0 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
1b1b0 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
1b1c0 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
1b1d0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1b1e0 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1b1f0 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
1b200 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
1b210 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
1b220 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1b230 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
1b240 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1b250 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
1b260 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1b270 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
1b280 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
1b290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b2a0 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
1b2b0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
1b2c0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1b2d0 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
1b2e0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
1b2f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
1b300 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1b310 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
1b320 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1b330 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1b340 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1b350 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1b360 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1b370 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
1b380 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b3a0 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
1b3b0 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
1b3c0 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1b3f0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1b400 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
1b410 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
1b420 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
1b430 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
1b440 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1b450 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
1b460 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1b470 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1b480 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
1b490 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
1b4a0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
1b4b0 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
1b4c0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1b4d0 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1b4e0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
1b4f0 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
1b500 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
1b510 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1b520 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
1b530 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1b540 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
1b550 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
1b560 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b570 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
1b580 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
1b590 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1b5a0 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b      pMem->z = 0;
1b5b0 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
1b5c0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1b5d0 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
1b5e0 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
1b5f0 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28   pMem++;.    if(
1b600 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c   (++u)>=p->nFiel
1b610 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
1b620 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
1b630 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
1b640 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
1b650 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = u;.}..#ifdef S
1b660 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1b670 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b680 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
1b690 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
1b6a0 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
1b6b0 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
1b6c0 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
1b6d0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
1b6e0 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
1b6f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1b700 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1b710 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
1b720 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
1b730 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
1b740 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b750 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
1b760 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
1b770 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
1b780 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
1b790 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b7a0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1b7b0 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
1b7c0 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
1b7d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b7e0 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
1b7f0 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
1b800 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
1b810 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1b820 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1b830 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
1b840 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
1b850 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
1b860 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
1b870 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
1b880 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
1b890 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1b8a0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
1b8b0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1b8c0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1b8d0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
1b8e0 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
1b8f0 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
1b900 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1b910 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b930 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
1b940 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1b950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b960 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b970 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1b980 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
1b990 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
1b9a0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1b9b0 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
1b9c0 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
1b9d0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1b9e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b9f0 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
1ba00 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
1ba10 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
1ba20 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ba30 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1ba40 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ba50 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
1ba60 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1ba70 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
1ba80 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1ba90 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
1baa0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
1bab0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1bac0 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1bad0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
1bae0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1baf0 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
1bb00 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
1bb10 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1bb20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
1bb30 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
1bb40 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1bb50 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1bb60 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1bb70 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1bb80 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
1bb90 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
1bba0 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
1bbb0 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
1bbc0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1bbd0 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
1bbe0 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
1bbf0 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
1bc00 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
1bc10 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
1bc20 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
1bc30 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
1bc40 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
1bc50 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
1bc60 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
1bc70 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
1bc80 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
1bc90 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
1bca0 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
1bcb0 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
1bcc0 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
1bcd0 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
1bce0 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
1bcf0 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
1bd00 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
1bd10 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1bd20 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
1bd30 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
1bd40 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1bd50 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
1bd60 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
1bd70 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
1bd80 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
1bd90 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
1bda0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1bdb0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1bdc0 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
1bdd0 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
1bde0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
1bdf0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
1be00 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1be10 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
1be20 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1be30 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
1be40 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1be50 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1be60 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1be70 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1be80 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1be90 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1bea0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1beb0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1bec0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
1bed0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
1bee0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
1bef0 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
1bf00 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
1bf10 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
1bf20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
1bf30 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
1bf40 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
1bf50 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1bf60 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
1bf70 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
1bf80 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
1bf90 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
1bfa0 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
1bfb0 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
1bfc0 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
1bfd0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
1bfe0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1bff0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
1c000 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
1c010 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
1c020 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
1c030 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
1c040 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
1c050 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
1c060 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
1c070 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
1c080 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1c090 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
1c0a0 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
1c0b0 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
1c0c0 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
1c0d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1c0e0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
1c0f0 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
1c100 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
1c110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c120 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
1c130 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
1c140 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
1c150 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1c160 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1c170 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1c180 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
1c190 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
1c1a0 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
1c1b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
1c1c0 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
1c1d0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
1c1e0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1c1f0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
1c200 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1c210 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1c220 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1c230 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1c240 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1c250 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1c260 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1c270 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1c280 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1c290 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1c2a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1c2b0 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1c2c0 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1c2d0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1c2e0 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1c2f0 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1c300 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1c310 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1c320 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1c330 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1c340 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1c350 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1c360 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1c370 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1c380 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1c390 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1c3a0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1c3b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1c3c0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1c3d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1c3e0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1c3f0 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1c400 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1c410 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1c420 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1c430 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1c440 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1c450 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1c460 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1c470 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1c480 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1c490 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1c4a0 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1c4b0 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1c4c0 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1c4d0 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1c4e0 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1c4f0 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1c500 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1c510 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1c520 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1c530 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1c540 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1c550 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1c560 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1c570 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1c580 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1c590 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1c5a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1c5b0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1c5c0 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1c5d0 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1c5e0 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1c5f0 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1c600 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1c610 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1c620 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1c630 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1c640 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1c650 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1c660 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
1c670 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1c680 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1c690 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1c6a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1c6b0 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1c6c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c6d0 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1c6e0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1c6f0 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1c700 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1c710 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1c720 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1c730 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1c740 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1c750 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
1c760 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1c770 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
1c780 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1c790 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1c7a0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1c7b0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1c7c0 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1c7d0 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1c7e0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1c7f0 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1c800 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1c810 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c820 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1c830 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1c840 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1c850 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1c860 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1c870 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1c880 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1c890 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c8a0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1c8b0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1c8c0 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1c8d0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1c8e0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1c8f0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1c900 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1c910 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1c920 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1c930 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1c940 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1c950 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1c960 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1c970 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1c980 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1c990 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1c9a0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1c9b0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1c9c0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1c9d0 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1c9e0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1c9f0 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1ca00 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1ca10 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1ca20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1ca30 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1ca40 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1ca50 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1ca60 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1ca70 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1ca80 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1ca90 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1caa0 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1cab0 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1cac0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1cad0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1cae0 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1caf0 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1cb00 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1cb10 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1cb20 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1cb30 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1cb40 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1cb50 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1cb60 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1cb70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1cb80 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1cb90 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1cbc0 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1cbd0 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1cbe0 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1cbf0 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1cc00 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1cc10 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1cc20 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1cc30 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1cc40 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1cc50 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1cc60 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1cc70 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1cc80 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1cc90 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1cca0 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1ccb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ccc0 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1ccd0 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1cce0 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1ccf0 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1cd00 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1cd10 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1cd20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1cd30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1cd40 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1cd50 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1cd60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1cd70 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1cd80 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1cd90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cda0 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1cdb0 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1cdc0 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1cdd0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1cde0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1cdf0 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1ce00 6e 63 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  nc);.    v2 = sq
1ce10 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1ce20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1ce30 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1ce40 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20  .    if( (v1==0 
1ce50 7c 7c 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20  || v2==0) ){.   
1ce60 20 20 20 69 66 28 20 70 72 63 45 72 72 20 29 20     if( prcErr ) 
1ce70 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1ce80 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1ce90 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
1cea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1ceb0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1cec0 6c 6c 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c  ll->pUser, c1.n,
1ced0 20 76 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a   v1, c2.n, v2);.
1cee0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1cef0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1cf00 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &c1);.    sqlite
1cf10 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1cf20 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  &c2);.    return
1cf30 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
1cf40 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f  * The input pBlo
1cf50 62 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  b is guaranteed 
1cf60 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61  to be a Blob tha
1cf70 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a  t is not marked.
1cf80 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f  ** with MEM_Zero
1cf90 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
1cfa0 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20  f it could be a 
1cfb0 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74  zero-blob..*/.st
1cfc0 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65  atic int isAllZe
1cfd0 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ro(const char *z
1cfe0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
1cff0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1d000 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
1d010 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30   z[i] ) return 0
1d020 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
1d030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
1d040 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52  re two blobs.  R
1d050 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1d060 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1d070 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a  e if the first.*
1d080 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  * is less than, 
1d090 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1d0a0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
1d0b0 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65  cond, respective
1d0c0 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c  ly..** If one bl
1d0d0 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  ob is a prefix o
1d0e0 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65  f the other, the
1d0f0 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73  n the shorter is
1d100 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a   the lessor..*/.
1d110 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
1d120 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74  INLINE int sqlit
1d130 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  e3BlobCompare(co
1d140 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f  nst Mem *pB1, co
1d150 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20  nst Mem *pB2){. 
1d160 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31   int c;.  int n1
1d170 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74   = pB1->n;.  int
1d180 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20   n2 = pB2->n;.. 
1d190 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
1d1a0 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f  le to have a Blo
1d1b0 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73  b value that has
1d1c0 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63   some non-zero c
1d1d0 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c  ontent.  ** foll
1d1e0 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e  owed by zero con
1d1f0 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20  tent.  But that 
1d200 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f  only comes up fo
1d210 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20  r Blobs formed. 
1d220 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61   ** by the OP_Ma
1d230 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c  keRecord opcode,
1d240 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20   and such Blobs 
1d250 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65 64  never get passed
1d260 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1d270 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20  e3MemCompare(). 
1d280 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  */.  assert( (pB
1d290 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  1->flags & MEM_Z
1d2a0 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30  ero)==0 || n1==0
1d2b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1d2c0 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B2->flags & MEM_
1d2d0 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d  Zero)==0 || n2==
1d2e0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31  0 );..  if( (pB1
1d2f0 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61  ->flags|pB2->fla
1d300 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  gs) & MEM_Zero )
1d310 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66  {.    if( pB1->f
1d320 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67  lags & pB2->flag
1d330 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
1d340 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31        return pB1
1d350 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d  ->u.nZero - pB2-
1d360 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65  >u.nZero;.    }e
1d370 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61  lse if( pB1->fla
1d380 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1d390 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c  .      if( !isAl
1d3a0 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42  lZero(pB2->z, pB
1d3b0 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d  2->n) ) return -
1d3c0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1d3d0 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e  pB1->u.nZero - n
1d3e0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
1d3f0 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1d400 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e  ro(pB1->z, pB1->
1d410 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  n) ) return +1;.
1d420 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20        return n1 
1d430 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a  - pB2->u.nZero;.
1d440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20      }.  }.  c = 
1d450 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70  memcmp(pB1->z, p
1d460 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e  B2->z, n1>n2 ? n
1d470 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63  2 : n1);.  if( c
1d480 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72   ) return c;.  r
1d490 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d  eturn n1 - n2;.}
1d4a0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d  ../*.** Do a com
1d4b0 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20  parison between 
1d4c0 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20  a 64-bit signed 
1d4d0 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34  integer and a 64
1d4e0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  -bit floating-po
1d4f0 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20  int.** number.  
1d500 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1d510 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1d520 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ve if the first 
1d530 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68  (i64) is less th
1d540 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c  an,.** equal to,
1d550 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1d560 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75   the second (dou
1d570 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ble)..*/.static 
1d580 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  int sqlite3IntFl
1d590 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69  oatCompare(i64 i
1d5a0 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69  , double r){.  i
1d5b0 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f  f( sizeof(LONGDO
1d5c0 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a  UBLE_TYPE)>8 ){.
1d5d0 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54      LONGDOUBLE_T
1d5e0 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55  YPE x = (LONGDOU
1d5f0 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20  BLE_TYPE)i;.    
1d600 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e  if( x<r ) return
1d610 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72   -1;.    if( x>r
1d620 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d630 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
1d640 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a  lse{.    i64 y;.
1d650 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20      double s;.  
1d660 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32    if( r<-9223372
1d670 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29  036854775808.0 )
1d680 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d690 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33 36  if( r>9223372036
1d6a0 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72 65  854775807.0 ) re
1d6b0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d  turn -1;.    y =
1d6c0 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28   (i64)r;.    if(
1d6d0 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31   i<y ) return -1
1d6e0 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b  ;.    if( i>y ){
1d6f0 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d  .      if( y==SM
1d700 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20  ALLEST_INT64 && 
1d710 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d  r>0.0 ) return -
1d720 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1d730 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  +1;.    }.    s 
1d740 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20  = (double)i;.   
1d750 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72   if( s<r ) retur
1d760 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e  n -1;.    if( s>
1d770 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1d780 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1d7a0 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e  e the values con
1d7b0 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77  tained by the tw
1d7c0 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20  o memory cells, 
1d7d0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67  returning.** neg
1d7e0 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
1d7f0 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31  ositive if pMem1
1d800 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1d810 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1d820 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d  ter.** than pMem
1d830 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72  2. Sorting order
1d840 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74   is NULL's first
1d850 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75  , followed by nu
1d860 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a  mbers (integers.
1d870 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f  ** and reals) so
1d880 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79  rted numerically
1d890 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65  , followed by te
1d8a0 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68  xt ordered by th
1d8b0 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
1d8c0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e  equence pColl an
1d8d0 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73  d finally blob's
1d8e0 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63   ordered by memc
1d8f0 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  mp()..**.** Two 
1d900 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1d910 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c  considered equal
1d920 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1d930 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1d940 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73  3MemCompare(cons
1d950 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f  t Mem *pMem1, co
1d960 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
1d970 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1d980 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c  Coll){.  int f1,
1d990 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
1d9a0 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
1d9b0 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
1d9c0 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
1d9d0 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
1d9e0 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
1d9f0 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69    assert( (combi
1da00 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ned_flags & MEM_
1da10 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a  RowSet)==0 );. .
1da20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1da30 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
1da40 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
1da50 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
1da60 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
1da70 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
1da80 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1da90 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
1daa0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1dab0 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
1dac0 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
1dad0 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74  }..  /* At least
1dae0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
1daf0 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62  values is a numb
1db00 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  er.  */.  if( co
1db10 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45  mbined_flags&(ME
1db20 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20  M_Int|MEM_Real) 
1db30 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1db40 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d   f2 & MEM_Int)!=
1db50 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1db60 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d  Mem1->u.i < pMem
1db70 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1db80 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1db90 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32  em1->u.i > pMem2
1dba0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b  ->u.i ) return +
1dbb0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1dbc0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1dbd0 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
1dbe0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1dbf0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1dc00 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   < pMem2->u.r ) 
1dc10 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1dc20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1dc30 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  > pMem2->u.r ) r
1dc40 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1dc50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1dc60 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1dc70 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1dc80 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
1dc90 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
1dca0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1dcb0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1dcc0 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32  Mem1->u.i, pMem2
1dcd0 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1dce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1dcf0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1dd00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1dd10 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  1&MEM_Real)!=0 )
1dd20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1dd30 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1dd40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73         return -s
1dd50 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1dd60 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69  mpare(pMem2->u.i
1dd70 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20  , pMem1->u.r);. 
1dd80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dd90 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1dda0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ddb0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a   return +1;.  }.
1ddc0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1ddd0 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61  ue is a string a
1dde0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
1ddf0 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69  a blob, the stri
1de00 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  ng is less..  **
1de10 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72   If both are str
1de20 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73  ings, compare us
1de30 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ing the collatin
1de40 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  g functions..  *
1de50 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1de60 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  _flags&MEM_Str )
1de70 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1de80 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1de90 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1dea0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
1deb0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1dec0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
1ded0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  1;.    }..    as
1dee0 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1def0 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20  ==pMem2->enc || 
1df00 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  pMem1->db->mallo
1df10 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
1df20 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1df30 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
1df40 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  | .            p
1df50 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1df60 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65  E_UTF16LE || pMe
1df70 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1df80 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20  UTF16BE );..    
1df90 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
1dfa0 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62   sequence must b
1dfb0 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69  e defined at thi
1dfc0 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66  s point, even if
1dfd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72  .    ** the user
1dfe0 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c   deletes the col
1dff0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1e000 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70  after the vdbe p
1e010 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a  rogram is.    **
1e020 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20   compiled (this 
1e030 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74  was not always t
1e040 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f  he case)..    */
1e050 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
1e060 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43  oll || pColl->xC
1e070 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  mp );..    if( p
1e080 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1e090 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65  turn vdbeCompare
1e0a0 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c  MemString(pMem1,
1e0b0 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30   pMem2, pColl, 0
1e0c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
1e0d0 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  If a NULL pointe
1e0e0 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20  r was passed as 
1e0f0 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63  the collate func
1e100 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75  tion, fall throu
1e110 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  gh.    ** to the
1e120 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75   blob case and u
1e130 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  se memcmp().  */
1e140 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68  .  }. .  /* Both
1e150 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1e160 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20  blobs.  Compare 
1e170 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
1e180 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
1e190 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1e1a0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d  pMem1, pMem2);.}
1e1b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .../*.** The fir
1e1c0 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
1e1d0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1e1e0 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d  ion is a serial-
1e1f0 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72  type that.** cor
1e200 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69  responds to an i
1e210 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c  nteger - all val
1e220 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ues between 1 an
1e230 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a  d 9 inclusive .*
1e240 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20  * except 7. The 
1e250 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f  second points to
1e260 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1e270 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20  ning an integer 
1e280 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69  value.** seriali
1e290 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  zed according to
1e2a0 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68   serial_type. Th
1e2b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1e2c0 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20  rializes.** and 
1e2d0 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75  returns the valu
1e2e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  e..*/.static i64
1e2f0 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1e300 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f  eInt(u32 serial_
1e310 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a  type, const u8 *
1e320 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a  aKey){.  u32 y;.
1e330 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1e340 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f  T_DB || (serial_
1e350 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61  type>=1 && seria
1e360 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72  l_type<=9 && ser
1e370 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a  ial_type!=7) );.
1e380 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1e390 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1e3a0 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a  e 0:.    case 1:
1e3b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e3c0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e3d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e  .      return ON
1e3e0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1e3f0 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20  ;.    case 2:.  
1e400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e410 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e420 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42      return TWO_B
1e430 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1e440 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20     case 3:.     
1e450 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1e460 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1e470 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59   return THREE_BY
1e480 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1e490 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20    case 4: {.    
1e4a0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e4b0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e4c0 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1e4d0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1e4e0 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1e4f0 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20  int*)&y;.    }. 
1e500 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20     case 5: {.   
1e510 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e520 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e530 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42     return FOUR_B
1e540 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1e550 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1e560 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1e570 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
1e580 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20  case 6: {.      
1e590 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
1e5a0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1e5b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e5c0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e5d0 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1e5e0 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1e5f0 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1e600 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36  return (i64)*(i6
1e610 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  4*)&x;.    }.  }
1e620 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69  ..  return (seri
1e630 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a  al_type - 8);.}.
1e640 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e650 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
1e660 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
1e670 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
1e680 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
1e690 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  y {nKey1, pKey1}
1e6a0 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74   and pPKey2.  It
1e6b0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
1e6c0 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
1e6d0 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
1e6e0 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73   if key1 is less
1e6f0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1e700 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
1e710 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b  han key2.  The {
1e720 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
1e730 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
1e740 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
1e750 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1e760 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
1e770 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
1e780 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
1e790 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
1e7a0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
1e7b0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1e7c0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
1e7d0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1e7e0 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  bSkip is non-zer
1e7f0 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
1e800 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1e810 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
1e820 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1e830 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  the first fields
1e840 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65   of the keys are
1e850 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65   equal..**.** Ke
1e860 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
1e870 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
1e880 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
1e890 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66  er of fields. If
1e8a0 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20   all .** fields 
1e8b0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62  that appear in b
1e8c0 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75  oth keys are equ
1e8d0 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d  al, then pPKey2-
1e8e0 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a  >default_rc is .
1e8f0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
1e900 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63  ** If database c
1e910 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73  orruption is dis
1e920 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b  covered, set pPK
1e930 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20  ey2->errCode to 
1e940 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
1e950 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e  PT and return 0.
1e960 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1e970 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1e980 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72   .** pPKey2->err
1e990 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53  Code is set to S
1e9a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c  QLITE_NOMEM and,
1e9b0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
1e9c0 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f  LL, the.** mallo
1e9d0 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65  c-failed flag se
1e9e0 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  t on database ha
1e9f0 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b  ndle (pPKey2->pK
1ea00 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a  eyInfo->db)..*/.
1ea10 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1ea20 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
1ea30 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79  Skip(.  int nKey
1ea40 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1ea50 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1ea60 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1ea70 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1ea80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1ea90 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  t key */.  int b
1eaa0 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20  Skip            
1eab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1eac0 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20   true, skip the 
1ead0 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29  first field */.)
1eae0 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1eb10 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1eb20 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1eb30 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1eb60 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f  next field to co
1eb70 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73  mpare */.  u32 s
1eb80 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  zHdr1;          
1eb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1eba0 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61  ze of record hea
1ebb0 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  der in bytes */.
1ebc0 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
1ebf0 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61  irst type in hea
1ec00 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  der */.  int rc 
1ec10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1ec20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1ec30 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65  rn value */.  Me
1ec40 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32  m *pRhs = pPKey2
1ec50 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a  ->aMem;       /*
1ec60 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70   Next field of p
1ec70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65  PKey2 to compare
1ec80 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1ec90 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1eca0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f  ->pKeyInfo;.  co
1ecb0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1ecc0 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
1ecd0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ece0 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d  *)pKey1;.  Mem m
1ecf0 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53  em1;..  /* If bS
1ed00 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65  kip is true, the
1ed10 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  n the caller has
1ed20 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69   already determi
1ed30 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1ed40 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  st.  ** two elem
1ed50 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73  ents in the keys
1ed60 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20   are equal. Fix 
1ed70 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63  the various stac
1ed80 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20  k variables so. 
1ed90 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f   ** that this ro
1eda0 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d  utine begins com
1edb0 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65  paring at the se
1edc0 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  cond field. */. 
1edd0 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20   if( bSkip ){.  
1ede0 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64    u32 s1;.    id
1edf0 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69  x1 = 1 + getVari
1ee00 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
1ee10 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20  s1);.    szHdr1 
1ee20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20  = aKey1[0];.    
1ee30 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71  d1 = szHdr1 + sq
1ee40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1ee50 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20  ypeLen(s1);.    
1ee60 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b  i = 1;.    pRhs+
1ee70 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1ee80 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1ee90 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1eea0 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  );.    d1 = szHd
1eeb0 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28  r1;.    if( d1>(
1eec0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1eed0 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  { .      pPKey2-
1eee0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1eef0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ef00 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1ef10 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69   0;  /* Corrupti
1ef20 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
1ef30 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56  i = 0;.  }..  VV
1ef40 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
1ef50 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
1ef60 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
1ef70 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1ef80 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ts */.  assert( 
1ef90 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1efa0 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d  ->nField+pPKey2-
1efb0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
1efc0 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1efd0 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  ld .       || CO
1efe0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1eff0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1f000 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1f010 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1f020 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1f030 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
1f040 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1f050 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1f060 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1f070 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1f080 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20  pe;..    /* RHS 
1f090 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  is an integer */
1f0a0 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66  .    if( pRhs->f
1f0b0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1f0c0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1f0d0 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1f0e0 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ];.      testcas
1f0f0 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1f100 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1f110 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1f120 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f130 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1f140 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f150 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1f160 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1f170 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1f180 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1f190 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1f1a0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1f1b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1f1c0 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72  mem1);.        r
1f1d0 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  c = -sqlite3IntF
1f1e0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73  loatCompare(pRhs
1f1f0 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29  ->u.i, mem1.u.r)
1f200 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f210 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
1f220 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1f230 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
1f240 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
1f250 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
1f260 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
1f270 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1f280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1f290 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1f2a0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1f2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1f2c0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1f2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f2e0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
1f2f0 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
1f300 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1f310 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1f320 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1f330 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1f340 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1f350 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1f360 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1f370 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20  s 12 or greater 
1f380 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20  are strings and 
1f390 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74  blobs (greater t
1f3a0 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  han.        ** n
1f3b0 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31  umbers). Types 1
1f3c0 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72  0 and 11 are cur
1f3d0 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64  rently "reserved
1f3e0 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20   for future .   
1f3f0 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f       ** use", so
1f400 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c   it doesn't real
1f410 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74  ly matter what t
1f420 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f  he results of co
1f430 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20  mparing.        
1f440 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65  ** them to numbe
1f450 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20  ric values are. 
1f460 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1f470 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1f480 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1f4a0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1f4b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1f4c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1f4d0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1f4e0 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1f4f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1f500 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1f510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
1f520 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e  em1.u.r<pRhs->u.
1f530 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1f540 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1f550 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
1f560 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72  m1.u.r>pRhs->u.r
1f570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f580 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1f590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1f5a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
1f5b0 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f   = sqlite3IntFlo
1f5c0 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75  atCompare(mem1.u
1f5d0 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a  .i, pRhs->u.r);.
1f5e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f5f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1f600 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
1f610 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1f620 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1f630 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
1f640 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1f650 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1f660 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1f670 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1f680 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1f690 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1f6a0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1f6b0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1f6c0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1f6d0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1f6e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1f6f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f700 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
1f710 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1f720 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1f730 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1f740 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
1f750 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1f760 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1f770 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
1f780 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1f790 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
1f7a0 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
1f7b0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1f7c0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1f7d0 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1f7e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f7f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f800 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f810 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1f820 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1f830 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1f840 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
1f850 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20       mem1.enc = 
1f860 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1f870 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62           mem1.db
1f880 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1f890 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1f8a0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b  flags = MEM_Str;
1f8b0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1f8c0 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79  z = (char*)&aKey
1f8d0 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  1[d1];.         
1f8e0 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72   rc = vdbeCompar
1f8f0 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20  eMemString(.    
1f900 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c            &mem1,
1f910 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d   pRhs, pKeyInfo-
1f920 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65  >aColl[i], &pPKe
1f930 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  y2->errCode.    
1f940 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1f950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f960 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1f970 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e  (mem1.n, pRhs->n
1f980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1f990 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1f9a0 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
1f9b0 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
1f9c0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1f9d0 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e  mem1.n - pRhs->n
1f9e0 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
1f9f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1fa00 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62  /* RHS is a blob
1fa10 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1fa20 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1fa30 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
1fa40 20 61 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e   assert( (pRhs->
1fa50 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1fa60 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d  )==0 || pRhs->n=
1fa70 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56  =0 );.      getV
1fa80 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1fa90 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1faa0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1fab0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1fac0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1fad0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1fae0 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
1faf0 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1fb00 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1fb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fb20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
1fb30 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1fb40 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1fb50 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
1fb60 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1fb70 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1fb80 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
1fb90 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1fba0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1fbb0 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
1fbc0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1fbd0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1fbe0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1fbf0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1fc00 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1fc10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1fc20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1fc30 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1fc40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73    }else if( pRhs
1fc50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1fc60 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
1fc70 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28  if( !isAllZero((
1fc80 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65  const char*)&aKe
1fc90 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a  y1[d1],nStr) ){.
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1fcb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
1fcc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1fcd0 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
1fce0 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  s->u.nZero;.    
1fcf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fd00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fd10 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1fd20 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
1fd30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1fd40 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1fd50 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1fd60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fd70 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
1fd80 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
1fd90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1fda0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1fdb0 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
1fdc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
1fdd0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1fde0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
1fdf0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
1fe00 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
1fe10 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1fe20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1fe30 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1fe40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1fe50 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1fe60 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1fe70 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1fe80 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1fe90 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20  Key2, rc) );.   
1fea0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1feb0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1fec0 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1fed0 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
1fee0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1fef0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68      i++;.    pRh
1ff00 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
1ff10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1ff20 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1ff30 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
1ff40 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
1ff50 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1ff60 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1ff70 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
1ff80 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1ff90 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73  ield && d1<=(uns
1ffa0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
1ffb0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1ffc0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1ffd0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1ffe0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1fff0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
20000 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
20010 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
20020 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
20030 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
20040 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
20050 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
20060 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
20070 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
20080 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
20090 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
200a0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
200b0 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
200c0 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
200d0 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
200e0 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
200f0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
20100 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
20110 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
20120 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
20130 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73  value.  */.  ass
20140 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
20150 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52  .       || vdbeR
20160 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
20170 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
20180 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e  pPKey2, pPKey2->
20190 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20  default_rc) .   
201a0 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d      || pKeyInfo-
201b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
201c0 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d  d.  );.  pPKey2-
201d0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72  >eqSeen = 1;.  r
201e0 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
201f0 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20  fault_rc;.}.int 
20200 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20210 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
20220 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
20230 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
20240 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
20250 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
20260 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2          /* 
20270 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
20280 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20290 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
202a0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
202b0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
202c0 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  0);.}.../*.** Th
202d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
202e0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
202f0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
20300 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20310 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
20320 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
20330 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
20340 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
20350 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
20360 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
20370 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
20380 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
20390 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
203a0 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
203b0 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
203c0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
203d0 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
203e0 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
203f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
20400 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
20410 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
20420 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
20430 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
20440 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
20450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
20460 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
20470 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
20480 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
20490 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
204a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
204b0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
204c0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
204d0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
204e0 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74  *aKey = &((const
204f0 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f   u8*)pKey1)[*(co
20500 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20  nst u8*)pKey1 & 
20510 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72  0x3F];.  int ser
20520 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e  ial_type = ((con
20530 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d  st u8*)pKey1)[1]
20540 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
20550 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20  32 y;.  u64 x;. 
20560 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68   i64 v;.  i64 lh
20570 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
20580 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
20590 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
205a0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
205b0 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  yInfo);.  assert
205c0 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c  ( (*(u8*)pKey1)<
205d0 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54  =0x3F || CORRUPT
205e0 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28  _DB );.  switch(
205f0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
20600 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
20610 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
20620 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20630 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  lhs = ONE_BYTE_I
20640 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20650 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
20660 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20670 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
20680 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
20690 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
206a0 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f        lhs = TWO_
206b0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
206c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
206d0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
206e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
206f0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
20700 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
20710 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
20720 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
20730 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
20740 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
20750 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20760 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
20770 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
20780 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
20790 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
207a0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
207b0 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a      lhs = (i64)*
207c0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20  (int*)&y;.      
207d0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
207e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
207f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
20800 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
20810 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
20820 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52        lhs = FOUR
20830 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
20840 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
20850 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
20860 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
20870 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
20880 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20890 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
208a0 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e  { /* 8-byte sign
208b0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
208c0 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54      x = FOUR_BYT
208d0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
208e0 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
208f0 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
20900 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
20910 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  lhs = *(i64*)&x;
20920 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20930 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
20940 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20950 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20   case 8: .      
20960 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  lhs = 0;.      b
20970 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39  reak;.    case 9
20980 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b  :.      lhs = 1;
20990 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
209a0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
209b0 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64  could be removed
209c0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
209d0 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
209e0 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   running.    ** 
209f0 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75  this code. Inclu
20a00 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67  ding it causes g
20a10 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  cc to generate a
20a20 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a   faster switch .
20a30 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
20a40 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67   (since the rang
20a50 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67  e of switch targ
20a60 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61  ets now starts a
20a70 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a  t zero and.    *
20a80 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29  * is contiguous)
20a90 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61   but does not ca
20aa0 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74  use any duplicat
20ab0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  e code to be gen
20ac0 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61  erated.    ** (a
20ad0 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20  s gcc is clever 
20ae0 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e  enough to combin
20af0 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63  e the two like c
20b00 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20  ases). Other .  
20b10 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d    ** compilers m
20b20 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e  ight be similar.
20b30 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30    */ .    case 0
20b40 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20  : case 7:.      
20b50 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
20b60 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20b70 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20b80 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61  Key2);..    defa
20b90 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
20ba0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
20bb0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
20bc0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
20bd0 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b  ;.  }..  v = pPK
20be0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
20bf0 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b  ;.  if( v>lhs ){
20c00 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
20c10 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r1;.  }else i
20c20 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20  f( v<lhs ){.    
20c30 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
20c40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
20c50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
20c60 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
20c70 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
20c80 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
20c90 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ual. Compare the
20ca0 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a   trailing .    *
20cb0 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20  * fields.  */.  
20cc0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
20cd0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20ce0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
20cf0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
20d00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20d10 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
20d20 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
20d30 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e  eys are equal an
20d40 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  d there are no t
20d50 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66  railing.    ** f
20d60 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50  ields. Return pP
20d70 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
20d80 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a   in this case. *
20d90 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  /.    res = pPKe
20da0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
20db0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65      pPKey2->eqSe
20dc0 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61  en = 1;.  }..  a
20dd0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
20de0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
20df0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20e00 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65  y2, res) );.  re
20e10 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
20e20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20e30 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
20e40 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
20e50 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20e60 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
20e70 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
20e80 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
20e90 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20   a string, that 
20ea0 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (b) the first fi
20eb0 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  eld.** uses the 
20ec0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
20ed0 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63  ce BINARY and (c
20ee0 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  ) that the size-
20ef0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
20f00 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72   .** at the star
20f10 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
20f20 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
20f30 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  gle byte..*/.sta
20f40 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
20f50 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
20f60 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
20f70 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
20f80 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
20f90 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
20fa0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
20fb0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
20fc0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
20fd0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38  Key1 = (const u8
20fe0 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73  *)pKey1;.  int s
20ff0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e  erial_type;.  in
21000 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74  t res;..  assert
21010 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
21020 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ].flags & MEM_St
21030 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72  r );.  vdbeAsser
21040 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
21050 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
21060 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
21070 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61  eyInfo);.  getVa
21080 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
21090 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
210a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
210b0 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20  e<12 ){.    res 
210c0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20  = pPKey2->r1;   
210d0 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
210e0 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20  y1) is a number 
210f0 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d  or a null */.  }
21100 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
21110 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
21120 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  { .    res = pPK
21130 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a  ey2->r2;      /*
21140 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69   (pKey1/nKey1) i
21150 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65  s a blob */.  }e
21160 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d  lse{.    int nCm
21170 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b  p;.    int nStr;
21180 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d  .    int szHdr =
21190 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20   aKey1[0];..    
211a0 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
211b0 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20  ype-12) / 2;.   
211c0 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53   if( (szHdr + nS
211d0 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20  tr) > nKey1 ){. 
211e0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
211f0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
21200 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21210 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
21220 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
21230 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   */.    }.    nC
21240 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32  mp = MIN( pPKey2
21250 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74  ->aMem[0].n, nSt
21260 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d  r );.    res = m
21270 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48  emcmp(&aKey1[szH
21280 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65  dr], pPKey2->aMe
21290 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a  m[0].z, nCmp);..
212a0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
212b0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53  {.      res = nS
212c0 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65  tr - pPKey2->aMe
212d0 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66  m[0].n;.      if
212e0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
212f0 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
21300 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
21310 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69        res = sqli
21320 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21330 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
21340 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21350 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  2, 1);.        }
21360 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21370 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
21380 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20  fault_rc;.      
21390 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65      pPKey2->eqSe
213a0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
213b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
213c0 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
213d0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
213e0 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r2;.      }else
213f0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
21400 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
21410 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
21420 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
21430 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21440 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
21450 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21460 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ->r1;.    }.  }.
21470 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
21480 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
21490 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
214a0 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20  pPKey2, res).   
214b0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
214c0 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65  B.       || pPKe
214d0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
214e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
214f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
21500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21510 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
21520 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
21530 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d  ordCompare() com
21540 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e  patible function
21550 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72  .** suitable for
21560 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61   comparing seria
21570 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f  lized records to
21580 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   the unpacked re
21590 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61  cord passed.** a
215a0 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
215b0 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f  ent..*/.RecordCo
215c0 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62  mpare sqlite3Vdb
215d0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70  eFindCompare(Unp
215e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
215f0 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f  .  /* varintReco
21600 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
21610 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  nd varintRecordC
21620 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62  ompareString() b
21630 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20  oth assume.  ** 
21640 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
21650 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74  -header varint t
21660 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
21670 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
21680 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73  record.  ** fits
21690 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
216a0 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f  e (i.e. is 127 o
216b0 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52  r less). varintR
216c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
216d0 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75  ).  ** also assu
216e0 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73  mes that it is s
216f0 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20  afe to overread 
21700 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c  a buffer by at l
21710 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d  east the .  ** m
21720 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20  aximum possible 
21730 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a  legal header siz
21740 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20  e plus 8 bytes. 
21750 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73  Because there is
21760 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64  .  ** guaranteed
21770 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
21780 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29  74 (but not 136)
21790 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
217a0 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  g following each
217b0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73  .  ** buffer pas
217c0 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63  sed to varintRec
217d0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
217e0 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f  this makes it co
217f0 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a  nvenient to.  **
21800 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20   limit the size 
21810 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f  of the header to
21820 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73   64 bytes in cas
21830 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72  es where the fir
21840 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73  st field.  ** is
21850 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a   an integer..  *
21860 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65  *.  ** The easie
21870 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63  st way to enforc
21880 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20  e this limit is 
21890 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79  to consider only
218a0 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20   records with.  
218b0 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20  ** 13 fields or 
218c0 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72  less. If the fir
218d0 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69  st field is an i
218e0 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69  nteger, the maxi
218f0 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68  mum legal.  ** h
21900 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31  eader size is (1
21910 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74  2*5 + 1 + 1) byt
21920 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  es.  */.  if( (p
21930 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
21940 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  ld + p->pKeyInfo
21950 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29  ->nXField)<=13 )
21960 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
21970 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  = p->aMem[0].fla
21980 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  gs;.    if( p->p
21990 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
219a0 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  der[0] ){.      
219b0 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->r1 = 1;.     
219c0 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20   p->r2 = -1;.   
219d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
219e0 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  >r1 = -1;.      
219f0 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d  p->r2 = 1;.    }
21a00 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
21a10 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20  & MEM_Int) ){.  
21a20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
21a30 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b  ecordCompareInt;
21a40 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
21a50 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
21a60 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
21a70 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
21a80 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74  EM_Null );.    t
21a90 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
21aa0 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
21ab0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d   if( (flags & (M
21ac0 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
21ad0 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26  |MEM_Blob))==0 &
21ae0 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
21af0 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Coll[0]==0 ){.  
21b00 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
21b10 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
21b20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
21b30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
21b40 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
21b50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21b60 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21b70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
21b80 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
21b90 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
21ba0 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
21bb0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
21bc0 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
21bd0 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
21be0 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
21bf0 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
21c00 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
21c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
21c20 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
21c30 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
21c40 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
21c50 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
21c60 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
21c70 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
21c80 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
21c90 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
21ca0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
21cb0 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
21cc0 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
21cd0 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
21ce0 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
21cf0 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
21d00 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
21d10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21d20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
21d30 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
21d40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
21d50 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
21d60 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
21d70 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
21d80 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
21d90 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
21da0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
21db0 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
21dc0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
21dd0 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
21de0 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
21df0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
21e00 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
21e10 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
21e20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
21e30 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
21e40 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
21e50 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
21e60 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
21e70 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
21e80 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
21e90 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
21ea0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
21eb0 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
21ec0 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
21ed0 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
21ee0 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
21ef0 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
21f00 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
21f10 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
21f20 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
21f30 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
21f40 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
21f50 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ur);.  assert( (
21f60 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
21f70 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
21f80 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
21f90 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
21fa0 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
21fb0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
21fc0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
21fd0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
21fe0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
21ff0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
22000 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
22010 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
22020 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
22030 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22040 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
22050 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
22060 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
22070 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
22080 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
22090 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
220a0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
220b0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
220c0 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
220d0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
220e0 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
220f0 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
22100 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
22110 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
22120 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
22130 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
22140 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
22150 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
22160 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
22170 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
22180 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
22190 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
221a0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
221b0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
221c0 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
221d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
221e0 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
221f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22200 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
22210 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22220 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
22230 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
22240 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22250 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
22260 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22270 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
22280 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22290 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
222a0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
222b0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
222c0 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
222d0 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
222e0 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
222f0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
22300 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
22310 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
22320 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
22330 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
22340 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
22350 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
22360 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
22370 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
22380 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
22390 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
223a0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
223b0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
223c0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
223d0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
223e0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
223f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
22400 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
22410 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
22420 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
22430 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
22440 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
22450 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22460 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22470 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
22480 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
22490 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
224a0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
224b0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
224c0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
224d0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
224e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
224f0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
22500 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
22510 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
22520 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
22530 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
22540 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
22550 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22560 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
22570 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
22580 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
22590 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
225a0 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
225b0 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
225c0 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
225d0 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
225e0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
225f0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
22600 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
22610 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
22620 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
22630 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
22640 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
22650 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
22660 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22670 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
22680 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
22690 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
226a0 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
226b0 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
226c0 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
226d0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
226e0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
226f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
22700 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
22710 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
22720 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
22730 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
22740 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
22750 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
22760 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
22770 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
22780 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
22790 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
227a0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
227b0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
227e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
227f0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
22820 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
22830 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
22840 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
22850 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
22860 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
22870 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
22880 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
22890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
228a0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
228b0 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
228c0 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
228d0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
228e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
228f0 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  ur;.  Mem m;..  
22900 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
22910 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
22920 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  REE );.  pCur = 
22930 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
22940 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22950 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
22960 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
22970 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
22980 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
22990 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43  e(pCur);.  /* nC
229a0 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
229b0 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
229c0 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
229d0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
229e0 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
229f0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
22a00 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
22a10 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
22a20 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
22a30 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
22a40 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
22a50 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
22a60 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
22a70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
22a80 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
22a90 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
22aa0 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
22ab0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
22ac0 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
22ad0 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
22ae0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
22af0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22b00 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
22b10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22b20 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
22b30 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
22b40 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
22b50 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
22b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22b70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
22b80 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
22b90 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
22ba0 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
22bb0 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
22bc0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
22bd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
22be0 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
22bf0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
22c00 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
22c10 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
22c20 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
22c30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22c40 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
22c50 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
22c60 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
22c70 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
22c80 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
22c90 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
22ca0 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
22cb0 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
22cc0 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
22cd0 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
22ce0 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
22cf0 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
22d00 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
22d10 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
22d20 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
22d30 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
22d40 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
22d50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
22d60 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22d70 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
22d80 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
22d90 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
22da0 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
22db0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
22dc0 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
22dd0 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
22de0 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
22df0 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
22e00 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
22e10 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
22e20 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
22e30 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
22e40 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
22e50 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
22e60 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
22e70 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
22e80 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
22e90 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
22ea0 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
22eb0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
22ec0 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
22ed0 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
22ee0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
22ef0 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
22f00 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
22f10 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
22f20 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
22f30 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
22f40 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
22f50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
22f60 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
22f70 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
22f80 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
22f90 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
22fa0 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
22fb0 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
22fc0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22fd0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
22fe0 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
22ff0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
23000 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
23010 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
23020 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
23030 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
23040 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
23050 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
23060 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
23070 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
23080 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
23090 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
230a0 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
230b0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
230c0 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
230d0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
230e0 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
230f0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
23100 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
23110 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
23120 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
23130 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
23140 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
23150 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
23160 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
23170 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
23180 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
23190 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
231a0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ];.    assert( (
231b0 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  v->db->flags & S
231c0 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
231d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
231e0 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
231f0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
23200 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
23210 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
23220 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
23230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
23240 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
23250 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
23260 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
23270 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
23280 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
23290 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
232a0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
232b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
232c0 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
232d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
232e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
232f0 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
23300 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
23310 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
23320 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
23330 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
23340 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
23350 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
23360 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
23370 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
23380 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
23390 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
233a0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
233b0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
233c0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
233d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
233e0 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (v->db->flags & 
233f0 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
23400 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  G)==0 );.  if( i
23410 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76  Var>=32 ){.    v
23420 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38  ->expmask |= 0x8
23430 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65  0000000;.  }else
23440 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
23450 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
23460 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
23470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23480 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
23490 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
234a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
234b0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
234c0 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
234d0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
234e0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
234f0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
23500 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
23510 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
23520 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
23530 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
23540 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
23550 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
23560 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
23570 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
23580 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
23590 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
235a0 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
235b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
235c0 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
235d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
235e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
235f0 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
23600 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
23610 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
23620 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23630 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
23640 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
23650 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
23660 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23670 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
23680 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
23690 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
236a0 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
236b0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
236c0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
236d0 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
236e0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
236f0 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
23700 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
23710 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
23720 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
23730 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
23740 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
23750 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
23760 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
23770 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
23780 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23790 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
237a0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
237b0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
237c0 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
237d0 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
237e0 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
237f0 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
23800 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
23810 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
23820 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55  b, int nField, U
23830 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
23840 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
23850 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23860 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
23870 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20  i++){.      Mem 
23880 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
23890 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
238a0 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73  Mem->zMalloc ) s
238b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
238c0 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
238d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
238e0 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
238f0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
23900 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
23910 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
23920 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23930 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
23940 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
23950 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
23960 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
23970 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
23980 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
23990 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
239a0 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
239b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
239c0 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
239d0 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
239e0 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
239f0 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
23a00 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
23a10 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
23a20 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
23a30 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
23a40 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
23a50 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
23a60 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
23a70 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
23a80 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
23a90 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
23ac0 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
23ad0 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
23ae0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
23af0 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
23b00 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
23b10 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
23b20 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
23b30 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
23b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23b50 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
23b60 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
23b70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23b80 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
23b90 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
23ba0 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
23bb0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
23bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
23bd0 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
23be0 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
23c10 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
23c20 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
23c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23c40 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
23c50 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
23c60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
23c70 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
23c80 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
23c90 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
23ca0 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
23cb0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
23cc0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
23cd0 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
23ce0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
23cf0 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
23d00 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
23d10 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
23d20 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
23d30 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
23d40 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
23d50 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
23d60 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
23d70 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
23d80 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
23d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23da0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
23db0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
23dc0 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
23dd0 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
23de0 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
23df0 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
23e00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
23e10 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
23e20 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
23e30 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
23e40 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
23e50 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
23e60 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
23e70 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
23e80 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
23e90 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
23ea0 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
23eb0 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
23ec0 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
23ed0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23ee0 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
23ef0 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
23f00 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
23f10 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23f20 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54  info.nField = pT
23f30 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75  ab->nCol;.  preu
23f40 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53  pdate.keyinfo.aS
23f50 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
23f60 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a  &fakeSortOrder;.
23f70 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
23f80 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65  1 = iKey1;.  pre
23f90 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69  update.iKey2 = i
23fa0 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74  Key2;.  preupdat
23fb0 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a  e.pTab = pTab;..
23fc0 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
23fd0 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20   = &preupdate;. 
23fe0 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
23ff0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65  allback(db->pPre
24000 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f  UpdateArg, db, o
24010 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b  p, zDb, zTbl, iK
24020 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64  ey1, iKey2);.  d
24030 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
24040 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
24050 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
24060 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64 62  .aRecord);.  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 55 6e 70 61 63 6b 65  eupdate.pUnpacke
240b0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
240c0 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
240d0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69  date.keyinfo.nFi
240e0 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
240f0 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a  .pNewUnpacked);.
24100 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e    if( preupdate.
24110 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  aNew ){.    int 
24120 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
24130 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20  i<pCsr->nField; 
24140 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
24150 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
24160 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65  e(&preupdate.aNe
24170 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w[i]);.    }.   
24180 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
24190 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61  (db, preupdate.a
241a0 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  New);.  }.}.#end
241b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
241c0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
241d0 4f 4b 20 2a 2f 0a                                OK */.