/ Hex Artifact Content
Login

Artifact ecd0468611925d218e1eb4b3f538907904b136f0e15e333291a232b521bfcef1:


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 28 64 62 2c 20 70 44  te3DbFree(db, pD
60c0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
60d0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
60e0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
60f0: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
6100: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
6110: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
6120: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
6130: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
6140: 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73  void freeP4Mem(s
6150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20  qlite3 *db, Mem 
6160: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  *p){.  if( p->sz
6170: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
6180: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
6190: 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65  alloc);.  sqlite
61a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
61b0: 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  }.static SQLITE_
61c0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
61d0: 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c 69  eeP4FuncCtx(sqli
61e0: 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33  te3 *db, sqlite3
61f0: 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  _context *p){.  
6200: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
6210: 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75  ction(db, p->pFu
6220: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  nc);.  sqlite3Db
6230: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 73  Free(db, p);.}.s
6240: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
6250: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
6260: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
6270: 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28 20  *p4){.  assert( 
6280: 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  db );.  switch( 
6290: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
62a0: 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b  se P4_FUNCCTX: {
62b0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75 6e  .      freeP4Fun
62c0: 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74 65  cCtx(db, (sqlite
62d0: 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a  3_context*)p4);.
62e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
62f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
6300: 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 34  EAL:.    case P4
6310: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 65  _INT64:.    case
6320: 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20   P4_DYNAMIC:.   
6330: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
6340: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
6350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
6360: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6370: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6380: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
6390: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
63a0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
63b0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
63c0: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
63d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
63e0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
63f0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
6400: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f  NTS.    case P4_
6410: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  EXPR: {.      sq
6420: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6430: 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a  db, (Expr*)p4);.
6440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6450: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
6460: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
6470: 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d  .      freeEphem
6480: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c  eralFunction(db,
6490: 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a   (FuncDef*)p4);.
64a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
64b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
64c0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EM: {.      if( 
64d0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
64e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
64f0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
6500: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
6510: 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p4);.      }else
6520: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34  {.        freeP4
6530: 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34  Mem(db, (Mem*)p4
6540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6560: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
6570: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d   {.      if( db-
6580: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
6590: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
65a0: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
65b0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
65c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
65d0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
65e0: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
65f0: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
6600: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
6610: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
6620: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
6630: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
6640: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
6650: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
6660: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
6670: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
6680: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
6690: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
66a0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
66b0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
66c0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
66d0: 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f   for(pOp=aOp; pO
66e0: 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70  p<&aOp[nOp]; pOp
66f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
6700: 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72 65  Op->p4type ) fre
6710: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
6720: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
6730: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6740: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6750: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
6760: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6770: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
6780: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
6790: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
67a0: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
67c0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
67d0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
67e0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
67f0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
6800: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
6810: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
6820: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
6830: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
6840: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
6850: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
6860: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
6870: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
6880: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
6890: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
68a0: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
68b0: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
68c0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
68d0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
68e0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
68f0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
6900: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
6910: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69  nto OP_Noop.*/.i
6920: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
6930: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
6940: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
6950: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
6960: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
6970: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
6980: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   0;.  assert( ad
6990: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
69a0: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
69b0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
69c0: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
69d0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
69e0: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
69f0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
6a00: 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ED;.  pOp->p4.z 
6a10: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  = 0;.  pOp->opco
6a20: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
6a30: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
6a40: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
6a50: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
6a60: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
6a70: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
6a80: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
6a90: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
6aa0: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
6ab0: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
6ac0: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
6ad0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
6ae0: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
6af0: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
6b00: 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e   p->nOp>0 && p->
6b10: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70  aOp[p->nOp-1].op
6b20: 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  code==op ){.    
6b30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
6b40: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
6b50: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d  , p->nOp-1);.  }
6b60: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6b70: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
6b80: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
6b90: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
6ba0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
6bb0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
6bc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6bd0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
6be0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
6bf0: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
6c00: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
6c10: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
6c20: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
6c30: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
6c40: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
6c50: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
6c60: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
6c70: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
6c80: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
6c90: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
6ca0: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
6cb0: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
6cc0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
6cd0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
6ce0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
6cf0: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
6d00: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
6d10: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
6d20: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
6d30: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
6d40: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
6d50: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
6d60: 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f  of zP4..** .** O
6d70: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
6d80: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
6d90: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
6da0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
6db0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
6dc0: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
6dd0: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
6de0: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
6df0: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
6e00: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
6e10: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
6e20: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
6e30: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
6e40: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
6e50: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
6e60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
6e70: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
6e80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
6e90: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49   void SQLITE_NOI
6ea0: 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65  NLINE vdbeChange
6eb0: 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a  P4Full(.  Vdbe *
6ec0: 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20  p,.  Op *pOp,.  
6ed0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
6ee0: 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66  .  int n.){.  if
6ef0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
6f00: 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64  .    freeP4(p->d
6f10: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
6f20: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
6f30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b  pOp->p4type = 0;
6f40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
6f50: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c   0;.  }.  if( n<
6f60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6f70: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
6f80: 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61  (int)(pOp - p->a
6f90: 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  Op), zP4, n);.  
6fa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
6fb0: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
6fc0: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
6fd0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
6fe0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
6ff0: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
7000: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7010: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
7020: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
7030: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
7040: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
7050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
7060: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
7070: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
7080: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
7090: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
70a0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
70b0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
70c0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
70d0: 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c  ert( p->aOp!=0 |
70e0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
70f0: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
7100: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7110: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
7120: 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  AB ) freeP4(db, 
7130: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
7140: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65  **)&zP4);.    re
7150: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
7160: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
7170: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
7180: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
7190: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
71a0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
71b0: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
71c0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
71d0: 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34   n>=0 || pOp->p4
71e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65  type ){.    vdbe
71f0: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20  ChangeP4Full(p, 
7200: 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  pOp, zP4, n);.  
7210: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7220: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
7230: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
7240: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
7250: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
7260: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
7270: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
7280: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
7290: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
72a0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
72b0: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
72c0: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
72d0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
72e0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
72f0: 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20  else if( zP4!=0 
7300: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
7310: 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 );.    pOp->p
7320: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
7330: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
7340: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
7350: 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50  )n;.    if( n==P
7360: 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65 33  4_VTAB ) sqlite3
7370: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
7380: 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  *)zP4);.  }.}../
7390: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
73a0: 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P4 operand of th
73b0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
73c0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
73d0: 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c  n .** to the val
73e0: 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ue defined by th
73f0: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
7400: 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70 65  is is a high-spe
7410: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
7420: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7430: 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  geP4()..**.** Th
7440: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73  e P4 operand mus
7450: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
7460: 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e  previously defin
7470: 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77  ed.  And the new
7480: 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20  .** P4 must not 
7490: 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73  be P4_INT32.  Us
74a0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
74b0: 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68 65  ngeP4() in eithe
74c0: 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61  r of.** those ca
74d0: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
74e0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
74f0: 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a  (Vdbe *p, void *
7500: 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56  pP4, int n){.  V
7510: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  dbeOp *pOp;.  as
7520: 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33  sert( n!=P4_INT3
7530: 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  2 && n!=P4_VTAB 
7540: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d  );.  assert( n<=
7550: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  0 );.  if( p->db
7560: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7570: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
7580: 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d  db, n, pP4);.  }
7590: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
75a0: 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20  ( pP4!=0 );.    
75b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
75c0: 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70   );.    pOp = &p
75d0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
75e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
75f0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
7600: 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d  USED );.    pOp-
7610: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20  >p4type = n;.   
7620: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34   pOp->p4.p = pP4
7630: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
7640: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
7650: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
7660: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
7670: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
7680: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
7690: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
76a0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
76b0: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
76c0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
76d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
76e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79  se->pVdbe;.  Key
76f0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
7700: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
7710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
7720: 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66  !=0 );.  pKeyInf
7730: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
7740: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
7750: 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70  , pIdx);.  if( p
7760: 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65  KeyInfo ) sqlite
7770: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
7780: 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45   pKeyInfo, P4_KE
7790: 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65  YINFO);.}..#ifde
77a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
77b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
77c0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
77d0: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
77e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
77f0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
7800: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
7810: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
7820: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
7830: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
7840: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
7850: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
7860: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
7870: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
7880: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
7890: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
78a0: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
78b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
78c0: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
78d0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
78e0: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
78f0: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
7900: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
7910: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
7920: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
7930: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
7940: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
7950: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7960: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
7970: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
7980: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
7990: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
79a0: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
79b0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
79c0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
79d0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
79e0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
79f0: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
7a00: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
7a10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
7a20: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
7a30: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
7a40: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
7a50: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
7a60: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
7a70: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
7a80: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
7a90: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
7aa0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
7ab0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
7ac0: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
7ad0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
7ae0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
7af0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
7b00: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7b10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b20: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
7b30: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
7b40: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
7b50: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
7b60: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
7b70: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
7b80: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
7b90: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
7ba0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
7bb0: 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  RAGE./*.** Set t
7bc0: 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  he value if the 
7bd0: 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66  iSrcLine field f
7be0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  or the previousl
7bf0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
7c00: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7c10: 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e  ite3VdbeSetLineN
7c20: 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69  umber(Vdbe *v, i
7c30: 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c  nt iLine){.  sql
7c40: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
7c50: 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  -1)->iSrcLine = 
7c60: 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  iLine;.}.#endif 
7c70: 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  /* SQLITE_VDBE_C
7c80: 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a  OVERAGE */../*.*
7c90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
7ca0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
7cb0: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
7cc0: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
7cd0: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
7ce0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7cf0: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
7d00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
7d10: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
7d20: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
7d30: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
7d40: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
7d50: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
7d60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
7d70: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
7d80: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
7d90: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
7da0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
7db0: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
7dc0: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
7dd0: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
7de0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
7df0: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
7e00: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
7e10: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
7e20: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
7e30: 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74  ter an OOM fault
7e40: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
7e50: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
7e60: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
7e70: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
7e80: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
7e90: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
7ea0: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
7eb0: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
7ec0: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
7ed0: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
7ee0: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
7ef0: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
7f00: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
7f10: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
7f20: 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ind..*/.VdbeOp *
7f30: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
7f40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
7f50: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
7f60: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
7f70: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
7f80: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
7f90: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
7fa0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
7fb0: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
7fc0: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
7fd0: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
7fe0: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
7ff0: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
8000: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
8010: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
8020: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
8030: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
8040: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
8050: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
8060: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
8070: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
8080: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
8090: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
80a0: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
80b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
80c0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
80d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
80e0: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
80f0: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
8100: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
8110: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
8120: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
8130: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
8140: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a  PLAIN_COMMENTS).
8150: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
8160: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
8170: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72  r one of the par
8180: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ameters to the o
8190: 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74  pcode pOp.** det
81a0: 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61  ermined by chara
81b0: 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69  cter c..*/.stati
81c0: 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50  c int translateP
81d0: 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f  (char c, const O
81e0: 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63  p *pOp){.  if( c
81f0: 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70  =='1' ) return p
8200: 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d  Op->p1;.  if( c=
8210: 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='2' ) return pO
8220: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p2;.  if( c==
8230: 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '3' ) return pOp
8240: 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p3;.  if( c=='
8250: 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  4' ) return pOp-
8260: 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  >p4.i;.  return 
8270: 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  pOp->p5;.}../*.*
8280: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
8290: 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d  ng for the "comm
82a0: 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20  ent" field of a 
82b0: 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74  VDBE opcode list
82c0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ing..**.** The S
82d0: 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69  ynopsis: field i
82e0: 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  n comments in th
82f0: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
8300: 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72  file gets conver
8310: 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74  ted.** to an ext
8320: 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ra string that i
8330: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
8340: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
8350: 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a  ame().  In the.*
8360: 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68  * absence of oth
8370: 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69  er comments, thi
8380: 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d  s synopsis becom
8390: 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  es the comment o
83a0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a  n the opcode..**
83b0: 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f   Some translatio
83c0: 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20  n occurs:.**.** 
83d0: 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20        "PX"      
83e0: 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20  ->  "r[X]".**   
83f0: 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e      "PX@PY"   ->
8400: 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20    "r[X..X+Y-1]" 
8410: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
8420: 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20  is 0 or 1.**    
8430: 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20     "PX@PY+1" -> 
8440: 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20   "r[X..X+Y]"    
8450: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
8460: 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59  s 0.**       "PY
8470: 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e  ..PY"  ->  "r[X.
8480: 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b  .Y]"      or "r[
8490: 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73  x]" if y<=x.*/.s
84a0: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
84b0: 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73  yComment(.  cons
84c0: 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f  t Op *pOp,     /
84d0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  * The opcode to 
84e0: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a  be commented */.
84f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8500: 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  4,   /* Previous
8510: 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75  ly obtained valu
8520: 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68  e for P4 */.  ch
8530: 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20  ar *zTemp,      
8540: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
8550: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
8560: 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Temp          /*
8570: 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
8580: 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29   in zTemp[] */.)
8590: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
85a0: 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  zOpName;.  const
85b0: 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73   char *zSynopsis
85c0: 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b  ;.  int nOpName;
85d0: 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20  .  int ii, jj;. 
85e0: 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a   char zAlt[50];.
85f0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
8600: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8610: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
8620: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
8630: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
8640: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
8650: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
8660: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
8670: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
8680: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
8690: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
86a0: 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73  e + 1;.    if( s
86b0: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
86c0: 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"IF ",3)==0 ){.
86d0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
86e0: 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  5 & SQLITE_STORE
86f0: 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  P2 ){.        sq
8700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
8710: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
8720: 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29  t, "r[P2] = (%s)
8730: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
8740: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8760: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
8770: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25  lt), zAlt, "if %
8780: 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e  s goto P2", zSyn
8790: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
87a0: 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69  }.      zSynopsi
87b0: 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a  s = zAlt;.    }.
87c0: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
87d0: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
87e0: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
87f0: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
8800: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
8810: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
8820: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
8830: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
8840: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
8850: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8860: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
8870: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
8880: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8890: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
88a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
88b0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
88c0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
88d0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
88e0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
88f0: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
8900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8910: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
8920: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
8930: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
8940: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8950: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8960: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
8970: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
8980: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
8990: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
89a0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
89b0: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
89c0: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
89d0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
89e0: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
89f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
8a00: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
8a10: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
8a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8a30: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
8a40: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
8a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8a60: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
8a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8aa0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
8ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8ac0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
8ad0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
8ae0: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
8af0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8b00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
8b10: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
8b20: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
8b30: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
8b40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8b50: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
8b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8b70: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
8b80: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8b90: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
8ba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
8bb0: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
8bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8bd0: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
8be0: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
8bf0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8c00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
8c10: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
8c20: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
8c30: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
8c40: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
8c50: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8c60: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
8c70: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
8c80: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
8c90: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
8ca0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
8cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8cc0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8cd0: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
8ce0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
8cf0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8d00: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
8d10: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
8d20: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
8d30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
8d40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8d50: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23  LITE_DEBUG */..#
8d60: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
8d70: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
8d80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
8d90: 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  OR_HINTS)./*.** 
8da0: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34  Translate the P4
8db0: 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72  .pExpr value for
8dc0: 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e   an OP_CursorHin
8dd0: 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65  t opcode into te
8de0: 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  xt.** that can b
8df0: 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74  e displayed in t
8e00: 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20  he P4 column of 
8e10: 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a  EXPLAIN output..
8e20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
8e30: 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74 72  isplayP4Expr(Str
8e40: 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a  Accum *p, Expr *
8e50: 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20  pExpr){.  const 
8e60: 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20  char *zOp = 0;. 
8e70: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
8e80: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
8e90: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  K_STRING:.      
8ea0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8eb0: 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  , "%Q", pExpr->u
8ec0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
8ed0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ee0: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
8ef0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8f00: 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d  (p, "%d", pExpr-
8f10: 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20  >u.iValue);.    
8f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8f30: 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  e TK_NULL:.     
8f40: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
8f50: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
8f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8f70: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
8f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8f90: 72 69 6e 74 66 28 70 2c 20 22 72 5b 25 64 5d 22  rintf(p, "r[%d]"
8fa0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
8fb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8fc0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8fd0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
8fe0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
8ff0: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
9000: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9010: 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20  p, "rowid");.   
9020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9030: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9040: 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29  (p, "c%d", (int)
9050: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
9060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9070: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9080: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
9090: 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20   zOp = "LT";    
90a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
90b0: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f  e TK_LE:      zO
90c0: 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62  p = "LE";      b
90d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
90e0: 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_GT:      zOp =
90f0: 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61   "GT";      brea
9100: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
9110: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  E:      zOp = "G
9120: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
9130: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
9140: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b       zOp = "NE";
9150: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9160: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
9170: 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20    zOp = "EQ";   
9180: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9190: 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
91a0: 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20  Op = "IS";      
91b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
91c0: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20  TK_ISNOT:   zOp 
91d0: 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65  = "ISNOT";   bre
91e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
91f0: 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  AND:     zOp = "
9200: 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  AND";     break;
9210: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
9220: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22        zOp = "OR"
9230: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9240: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
9250: 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20     zOp = "ADD"; 
9260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9270: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
9280: 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20  zOp = "MUL";    
9290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
92a0: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70   TK_MINUS:   zOp
92b0: 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72   = "SUB";     br
92c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
92d0: 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _REM:     zOp = 
92e0: 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b  "REM";     break
92f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
9300: 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49  TAND:  zOp = "BI
9310: 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  TAND";  break;. 
9320: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
9330: 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52  :   zOp = "BITOR
9340: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9350: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20  case TK_SLASH:  
9360: 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20   zOp = "DIV";   
9370: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9380: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f  e TK_LSHIFT:  zO
9390: 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62  p = "LSHIFT";  b
93a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
93b0: 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_RSHIFT:  zOp =
93c0: 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61   "RSHIFT";  brea
93d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  k;.    case TK_C
93e0: 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43  ONCAT:  zOp = "C
93f0: 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ONCAT";  break;.
9400: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
9410: 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55  US:  zOp = "MINU
9420: 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  S";   break;.   
9430: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
9440: 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20    zOp = "PLUS"; 
9450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9460: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
9470: 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20  Op = "BITNOT";  
9480: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9490: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20  TK_NOT:     zOp 
94a0: 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65  = "NOT";     bre
94b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
94c0: 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22  ISNULL:  zOp = "
94d0: 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b  ISNULL";  break;
94e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
94f0: 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54  NULL: zOp = "NOT
9500: 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NULL"; break;.. 
9510: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
9520: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9530: 28 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22  (p, "%s", "expr"
9540: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9550: 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29    }..  if( zOp )
9560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
9570: 69 6e 74 66 28 70 2c 20 22 25 73 28 22 2c 20 7a  intf(p, "%s(", z
9580: 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79  Op);.    display
9590: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
95a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28  >pLeft);.    if(
95b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
95c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
95d0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c  trAccumAppend(p,
95e0: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ",", 1);.      
95f0: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c  displayP4Expr(p,
9600: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
9610: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9620: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
9630: 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d  (p, ")", 1);.  }
9640: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
9650: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20  E_DISPLAY_P4 && 
9660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9670: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
9680: 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42  TS) */...#if VDB
9690: 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a  E_DISPLAY_P4./*.
96a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
96b0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
96c0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
96d0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
96e0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
96f0: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
9700: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
9710: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
9720: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
9730: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
9740: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
9750: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
9760: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41   = zTemp;.  StrA
9770: 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65 72 74  ccum x;.  assert
9780: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
9790: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
97a0: 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d  Init(&x, 0, zTem
97b0: 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20  p, nTemp, 0);.  
97c0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
97d0: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
97e0: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
97f0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
9800: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
9810: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
9820: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  yInfo;.      ass
9830: 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
9840: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
9850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9860: 69 6e 74 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  intf(&x, "k(%d",
9870: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
9880: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  d);.      for(j=
9890: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
98a0: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
98b0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
98c0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
98d0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
98e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
98f0: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  oll = pColl ? pC
9900: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b  oll->zName : "";
9910: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
9920: 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41  cmp(zColl, "BINA
9930: 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20  RY")==0 ) zColl 
9940: 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73  = "B";.        s
9950: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9960: 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79 49  , ",%s%s", pKeyI
9970: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
9980: 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  j] ? "-" : "", z
9990: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Coll);.      }. 
99a0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
99b0: 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22  ccumAppend(&x, "
99c0: 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  )", 1);.      br
99d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
99e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
99f0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
9a00: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
9a10: 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34  .      displayP4
9a20: 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34  Expr(&x, pOp->p4
9a30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  .pExpr);.      b
9a40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9a50: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43  if.    case P4_C
9a60: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
9a70: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
9a80: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
9a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9aa0: 69 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30 73  intf(&x, "(%.20s
9ab0: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
9ac0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9ad0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
9ae0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
9af0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
9b00: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
9b10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  ;.      sqlite3X
9b20: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25  Printf(&x, "%s(%
9b30: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
9b40: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
9b50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9b60: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
9b70: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
9b80: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
9b90: 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50 34  ILE).    case P4
9ba0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
9bb0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
9bc0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e  = pOp->p4.pCtx->
9bd0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
9be0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9bf0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
9c00: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
9c10: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
9c20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9c30: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
9c40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9c50: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c  XPrintf(&x, "%ll
9c60: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
9c70: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
9c80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9c90: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
9ca0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9cb0: 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  (&x, "%d", pOp->
9cc0: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
9cd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9ce0: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
9cf0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9d00: 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20  tf(&x, "%.16g", 
9d10: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
9d20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9d30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
9d40: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
9d50: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
9d60: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
9d70: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9d80: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
9d90: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
9da0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9db0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9dc0: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
9dd0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9de0: 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  (&x, "%lld", pMe
9df0: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
9e00: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
9e10: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
9e20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9e30: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9e40: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
9e50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
9e60: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
9e70: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
9e80: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
9e90: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
9ea0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9eb0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9ec0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
9ed0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
9ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ef0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
9f00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9f10: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
9f20: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
9f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9f40: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
9f50: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
9f60: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
9f70: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76 74  3XPrintf(&x, "vt
9f80: 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a  ab:%p", pVtab);.
9f90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9fa0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
9fb0: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
9fc0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
9fd0: 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70       int *ai = p
9fe0: 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
9ff0: 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20   int n = ai[0]; 
a000: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65    /* The first e
a010: 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54  lement of an INT
a020: 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20  ARRAY is always 
a030: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
a040: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f             ** co
a050: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
a060: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f  r of elements to
a070: 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20   follow */.     
a080: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69   for(i=1; i<n; i
a090: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
a0a0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a0b0: 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20  ",%d", ai[i]);. 
a0c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
a0d0: 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20  mp[0] = '[';.   
a0e0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
a0f0: 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d 22  umAppend(&x, "]"
a100: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
a110: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a120: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
a130: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a140: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72 6f  XPrintf(&x, "pro
a150: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
a160: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a170: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
a180: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
a190: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
a1a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a1b0: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20  e P4_TABLE: {.  
a1c0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
a1d0: 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70  tf(&x, "%s", pOp
a1e0: 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  ->p4.pTab->zName
a1f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a200: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
a210: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
a220: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
a230: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
a240: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
a250: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
a260: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
a270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
a280: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
a290: 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65  nish(&x);.  asse
a2a0: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
a2b0: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
a2c0: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a2d0: 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a  PLAY_P4 */../*.*
a2e0: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
a2f0: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
a300: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
a310: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
a320: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
a330: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
a340: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
a350: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
a360: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
a370: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
a380: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
a390: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
a3a0: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
a3b0: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
a3c0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
a3d0: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
a3e0: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
a3f0: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
a400: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
a410: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
a420: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
a430: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a440: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
a450: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
a460: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
a470: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
a480: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
a490: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
a4a0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
a4b0: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
a4c0: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
a4d0: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
a4e0: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
a4f0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
a500: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
a510: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
a520: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
a530: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
a540: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
a550: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a560: 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a  ARED_CACHE)./*.*
a570: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
a580: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
a590: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
a5a0: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
a5b0: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
a5c0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
a5d0: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
a5e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
a5f0: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
a600: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
a610: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
a620: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
a630: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
a640: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
a650: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
a660: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
a670: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
a680: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
a690: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
a6a0: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
a6b0: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
a6c0: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
a6d0: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
a6e0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
a6f0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
a700: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
a710: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
a720: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
a730: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
a740: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
a750: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
a760: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
a770: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
a780: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
a790: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
a7a0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
a7b0: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
a7c0: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
a7d0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
a7e0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
a7f0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
a800: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
a810: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
a820: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
a830: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
a840: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
a850: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
a860: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
a870: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
a880: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
a890: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
a8a0: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
a8b0: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
a8c0: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
a8d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
a8e0: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
a8f0: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
a900: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
a910: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
a920: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
a930: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
a940: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
a950: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
a960: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
a970: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
a980: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
a990: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
a9a0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
a9b0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
a9c0: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
a9d0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
a9e0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
a9f0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
aa00: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
aa10: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
aa20: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
aa30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
aa40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
aa50: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
aa60: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
aa70: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
aa80: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
aa90: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
aaa0: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
aab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
aac0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
aad0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
aae0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
aaf0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
ab00: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
ab10: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
ab20: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
ab30: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
ab40: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
ab50: 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er()..*/.static 
ab60: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
ab70: 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56  void vdbeLeave(V
ab80: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
ab90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
aba0: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
abb0: 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d  t nDb;.  db = p-
abc0: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
abd0: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
abe0: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
abf0: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
ac00: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
ac10: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
ac20: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
ac30: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
ac40: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
ac50: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
ac60: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
ac70: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
ac80: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
ac90: 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61   *p){.  if( DbMa
aca0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
acb0: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
acc0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
acd0: 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65  case */.  vdbeLe
ace0: 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  ave(p);.}.#endif
acf0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
ad00: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
ad10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
ad20: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
ad30: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
ad40: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
ad50: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
ad60: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
ad70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
ad80: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
ad90: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
ada0: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
adb0: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
adc0: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31  ];.  char zCom[1
add0: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  00];.  static co
ade0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
adf0: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
ae00: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33  %4d %4d %4d %-13
ae10: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
ae20: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
ae30: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
ae40: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
ae50: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
ae60: 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20  (zPtr));.#ifdef 
ae70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
ae80: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
ae90: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
aea0: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20  pOp, zP4, zCom, 
aeb0: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23  sizeof(zCom));.#
aec0: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d  else.  zCom[0] =
aed0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   0;.#endif.  /* 
aee0: 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33  NB:  The sqlite3
aef0: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e  OpcodeName() fun
af00: 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
af10: 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65  nted by code cre
af20: 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  ated.  ** by the
af30: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61   mkopcodeh.awk a
af40: 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b  nd mkopcodec.awk
af50: 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65   scripts which e
af60: 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20  xtract the.  ** 
af70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
af80: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
af90: 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72  ce text */.  fpr
afa0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
afb0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
afc0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
afd0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
afe0: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
aff0: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
b000: 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a  pOp->p5,.      z
b010: 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  Com.  );.  fflus
b020: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
b030: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
b040: 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ize an array of 
b050: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a  N Mem element..*
b060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
b070: 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  itMemArray(Mem *
b080: 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65  p, int N, sqlite
b090: 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67 73  3 *db, u16 flags
b0a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d  ){.  while( (N--
b0b0: 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62  )>0 ){.    p->db
b0c0: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c   = db;.    p->fl
b0d0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
b0e0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
b0f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b100: 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53 63  DEBUG.    p->pSc
b110: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
b120: 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d  dif.    p++;.  }
b130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
b140: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
b150: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
b160: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b170: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
b180: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
b190: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
b1a0: 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e  Mem *pEnd = &p[N
b1b0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
b1c0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
b1d0: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
b1e0: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
b1f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
b200: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
b210: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
b220: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
b230: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
b240: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
b250: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
b260: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
b270: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
b280: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
b290: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
b2a0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
b2b0: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
b2c0: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
b2d0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
b2e0: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
b2f0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
b300: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
b310: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
b320: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
b330: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
b340: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
b350: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
b360: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
b370: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
b380: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
b390: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
b3a0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
b3b0: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
b3c0: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
b3d0: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
b3e0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
b3f0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
b400: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
b410: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
b420: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
b430: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
b440: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
b450: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
b460: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
b470: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
b480: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
b490: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
b4a0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
b4b0: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
b4c0: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
b4d0: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
b4e0: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
b4f0: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
b500: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
b510: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
b520: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
b530: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
b540: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
b550: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
b560: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
b570: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
b580: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
b590: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
b5a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b5b0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
b5c0: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
b5d0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
b5e0: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
b5f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
b600: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d  flags & MEM_Fram
b610: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
b620: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
b630: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20  MEM_RowSet );.  
b640: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
b650: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
b660: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
b670: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
b680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
b690: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
b6a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
b6b0: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
b6c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b6d0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
b6e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a  );.        p->sz
b6f0: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
b700: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
b710: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
b720: 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ned;.    }while(
b730: 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20   (++p)<pEnd );. 
b740: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
b750: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
b760: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
b770: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
b780: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
b790: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
b7a0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
b7b0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
b7c0: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
b7d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
b7e0: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
b7f0: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
b800: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
b810: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
b820: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
b830: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
b840: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
b850: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
b860: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
b870: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
b880: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
b890: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
b8a0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
b8b0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
b8c0: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
b8d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ;.  sqlite3VdbeD
b8e0: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e  eleteAuxData(p->
b8f0: 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44  v->db, &p->pAuxD
b900: 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73  ata, -1, 0);.  s
b910: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
b920: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
b930: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b940: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
b950: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
b960: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
b970: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
b980: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
b990: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
b9a0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
b9b0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
b9c0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
b9d0: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
b9e0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
b9f0: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
ba00: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
ba10: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
ba20: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
ba30: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
ba40: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
ba50: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
ba60: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
ba70: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
ba80: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
ba90: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
baa0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
bab0: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
bac0: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
bad0: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
bae0: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
baf0: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
bb00: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
bb10: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
bb20: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
bb30: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
bb40: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
bb50: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
bb60: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
bb70: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
bb80: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
bb90: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
bba0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
bbb0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
bbe0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
bc10: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
bc20: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
bc30: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
bc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bc60: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
bc70: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
bc80: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
bc90: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
bca0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
bcb0: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
bcc0: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
bcf0: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
bd00: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
bd10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bd20: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
bd30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
bd40: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
bd50: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bd80: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bd90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bda0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
bdb0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
bdc0: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
bdd0: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
bde0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
bdf0: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
be00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
be10: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
be20: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
be30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
be40: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
be50: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
be60: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
be70: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
be80: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
be90: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
bea0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
beb0: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
bec0: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
bed0: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
bee0: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
bef0: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
bf00: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
bf10: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
bf20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
bf30: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
bf40: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
bf50: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
bf60: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
bf70: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
bf80: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
bf90: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
bfa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
bfb0: 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f  EM_BKPT ){.    /
bfc0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
bfd0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
bfe0: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
bff0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
c000: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
c010: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
c020: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
c030: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  /.    sqlite3Oom
c040: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
c050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
c060: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  OR;.  }..  /* Wh
c070: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
c080: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61   output rows rea
c090: 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20  ches nRow, that 
c0a0: 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c  means the.  ** l
c0b0: 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73  isting has finis
c0c0: 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  hed and sqlite3_
c0d0: 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65  step() should re
c0e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
c0f0: 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74  ..  ** nRow is t
c100: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
c110: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
c120: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
c130: 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20  , plus.  ** the 
c140: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
c150: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c  r of rows in all
c160: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
c170: 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rams encountered
c180: 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54  .  ** so far.  T
c190: 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69  he nRow value wi
c1a0: 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e  ll increase as n
c1b0: 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ew trigger subpr
c1c0: 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20  ograms are.  ** 
c1d0: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74  encountered, but
c1e0: 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e   p->pc will even
c1f0: 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20  tually catch up 
c200: 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20  to nRow..  */.  
c210: 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  nRow = p->nOp;. 
c220: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
c230: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =1 ){.    /* The
c240: 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20   first 8 memory 
c250: 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66  cells are used f
c260: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
c270: 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20  t.  So we will. 
c280: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72     ** commandeer
c290: 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f   the 9th cell to
c2a0: 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20   use as storage 
c2b0: 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20  for an array of 
c2c0: 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20  pointers.    ** 
c2d0: 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72  to trigger subpr
c2e0: 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42  ograms.  The VDB
c2f0: 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  E is guaranteed 
c300: 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  to have at least
c310: 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e   9.    ** cells.
c320: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
c330: 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20   p->nMem>9 );.  
c340: 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65    pSub = &p->aMe
c350: 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  m[9];.    if( pS
c360: 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c  ub->flags&MEM_Bl
c370: 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ob ){.      /* O
c380: 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  n the first call
c390: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
c3a0: 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f  (), pSub will ho
c3b0: 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69  ld a NULL.  It i
c3c0: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69  s.      ** initi
c3d0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42  alized to a BLOB
c3e0: 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52   by the P4_SUBPR
c3f0: 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67  OGRAM processing
c400: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a   logic below */.
c410: 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75        nSub = pSu
c420: 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65  b->n/sizeof(Vdbe
c430: 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20  *);.      apSub 
c440: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
c450: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a  )pSub->z;.    }.
c460: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c470: 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Sub; i++){.     
c480: 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69   nRow += apSub[i
c490: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
c4a0: 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  }..  do{.    i =
c4b0: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
c4c0: 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d  le( i<nRow && p-
c4d0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
c4e0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
c4f0: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
c500: 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a   if( i>=nRow ){.
c510: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
c520: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
c530: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
c540: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
c550: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
c560: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c570: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
c580: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
c590: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
c5a0: 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71  3VdbeError(p, sq
c5b0: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
c5c0: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
c5d0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
c5e0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
c5f0: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
c600: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
c610: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
c620: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
c630: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
c640: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
c650: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
c660: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
c670: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
c680: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
c690: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
c6a0: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
c6b0: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
c6c0: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
c6d0: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
c6e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
c6f0: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
c700: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
c710: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
c720: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
c730: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
c740: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
c750: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
c760: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
c770: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
c780: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
c790: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
c7a0: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
c7b0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
c7c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
c7d0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
c800: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
c810: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
c820: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c830: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
c840: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
c850: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
c860: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
c870: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
c880: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
c890: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
c8a0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
c8b0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
c8c0: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
c8d0: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
c8e0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
c8f0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
c900: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
c910: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
c920: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
c930: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
c940: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
c950: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
c960: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
c970: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
c980: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
c990: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
c9a0: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
c9b0: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
c9c0: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
c9d0: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
c9e0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
c9f0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
ca00: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
ca10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ca20: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
ca30: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
ca40: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
ca50: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
ca60: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
ca70: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
ca80: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
ca90: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
caa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
cab0: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
cac0: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
cad0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
cae0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
caf0: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
cb00: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
cb10: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
cb20: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
cb30: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
cb40: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
cb50: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
cb60: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
cb70: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
cb80: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
cb90: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
cba0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
cbb0: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
cbc0: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
cbd0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
cbe0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
cbf0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
cc00: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
cc10: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
cc40: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
cc50: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
cc60: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
cc70: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
cc80: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cca0: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
ccb0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
ccc0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
ccd0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
cce0: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
cd10: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
cd20: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
cd30: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
cd40: 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a   100) ){ /* P4 *
cd50: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
cd60: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
cd70: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
cd80: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
cd90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
cda0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
cdb0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
cdc0: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
cdd0: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d  pOp, pMem->z, pM
cde0: 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  em->szMalloc);. 
cdf0: 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d     if( zP4!=pMem
ce00: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ->z ){.      pMe
ce10: 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
ce20: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
ce30: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
ce40: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
ce50: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
ce60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
ce70: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
ce80: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
ce90: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
cea0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
ceb0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
cec0: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
ced0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
cee0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
cef0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cf00: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
cf10: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
cf20: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
cf30: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
cf40: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
cf50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cf60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
cf70: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
cf80: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
cf90: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
cfa0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
cfb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
cfc0: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
cfd0: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
cfe0: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
cff0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
d000: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
d010: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
d020: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
d030: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
d040: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d050: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
d060: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
d070: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
d080: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
d090: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
d0a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d0b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
d0c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
d0d0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
d0e0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
d0f0: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
d100: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
d110: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
d120: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
d130: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
d140: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
d150: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
d180: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
d190: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
d1a0: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
d1b0: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
d1c0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
d1d0: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
d1e0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
d1f0: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
d200: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
d210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
d220: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d230: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
d240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
d250: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
d260: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
d270: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
d280: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
d290: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d2a0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
d2b0: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
d2c0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
d2d0: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
d2e0: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
d2f0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
d300: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
d310: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
d320: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
d330: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
d340: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
d350: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
d360: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
d370: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
d380: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
d390: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
d3a0: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
d3b0: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
d3c0: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
d3d0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d3e0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
d3f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
d400: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
d410: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
d420: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
d430: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
d440: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
d450: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
d460: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
d470: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
d480: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
d490: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
d4a0: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
d4b0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
d4c0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
d4d0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
d4e0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
d4f0: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
d500: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
d510: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
d520: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
d530: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
d540: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
d550: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
d560: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
d570: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
d580: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
d590: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
d5a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
d5b0: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
d5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d5d0: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
d5e0: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
d5f0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
d600: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d610: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
d620: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
d630: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
d640: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
d650: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
d660: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
d670: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
d680: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
d690: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
d6a0: 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  */../* An instan
d6b0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
d6c0: 74 20 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b  t describes bulk
d6d0: 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   memory availabl
d6e0: 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20  e for use.** by 
d6f0: 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66  subcomponents of
d700: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
d710: 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73  ement.  Space is
d720: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a   allocated out.*
d730: 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53  * of a ReusableS
d740: 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74  pace object by t
d750: 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20  he allocSpace() 
d760: 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a  routine below..*
d770: 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61 62 6c  /.struct Reusabl
d780: 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70  eSpace {.  u8 *p
d790: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
d7a0: 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d  /* Available mem
d7b0: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ory */.  int nFr
d7c0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee;           /*
d7d0: 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   Bytes of availa
d7e0: 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ble memory */.  
d7f0: 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20  int nNeeded;    
d800: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79       /* Total by
d810: 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e  tes that could n
d820: 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
d830: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f  */.};../* Try to
d840: 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   allocate nByte 
d850: 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20  bytes of 8-byte 
d860: 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d  aligned bulk mem
d870: 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20  ory for pBuf.** 
d880: 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c  from the Reusabl
d890: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20  eSpace object.  
d8a0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
d8b0: 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
d8c0: 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73  d.** memory on s
d8d0: 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75  uccess.  If insu
d8e0: 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20  fficient memory 
d8f0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
d900: 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53  the.** ReusableS
d910: 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63  pace object, inc
d920: 72 65 61 73 65 20 74 68 65 20 52 65 75 73 61 62  rease the Reusab
d930: 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a  leSpace.nNeeded.
d940: 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65 20  ** value by the 
d950: 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e  amount needed an
d960: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
d970: 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20  *.** If pBuf is 
d980: 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  not initially NU
d990: 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  LL, that means t
d9a0: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68  hat the memory h
d9b0: 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
d9c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  en allocated by 
d9d0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
d9e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f  this routine, so
d9f0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63   just return a c
da00: 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61  opy.** of pBuf a
da10: 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c  nd leave Reusabl
da20: 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64  eSpace unchanged
da30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c  ..**.** This all
da40: 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79  ocator is employ
da50: 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20  ed to repurpose 
da60: 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20  unused slots at 
da70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
da80: 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f  * opcode array o
da90: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
daa0: 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72   for other memor
dab0: 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70  y needs of the p
dac0: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
dad0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
dae0: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
daf0: 28 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61  (.  struct Reusa
db00: 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a  bleSpace *p,  /*
db10: 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61   Bulk memory ava
db20: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
db30: 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ation */.  void 
db40: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
db50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
db60: 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63  to a prior alloc
db70: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
db80: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
db90: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
dba0: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a   memory needed *
dbb0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
dbc0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
dbd0: 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29  ENT(p->pSpace) )
dbe0: 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
dbf0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52  ){.    nByte = R
dc00: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20  OUND8(nByte);.  
dc10: 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70    if( nByte <= p
dc20: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ->nFree ){.     
dc30: 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79   p->nFree -= nBy
dc40: 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  te;.      pBuf =
dc50: 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e   &p->pSpace[p->n
dc60: 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  Free];.    }else
dc70: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64  {.      p->nNeed
dc80: 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ed += nByte;.   
dc90: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
dca0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
dcb0: 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20  NMENT(pBuf) );. 
dcc0: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
dcd0: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
dce0: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
dcf0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
dd00: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
dd10: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
dd20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
dd30: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
dd40: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
dd50: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
dd60: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
dd70: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
dd80: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
dd90: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
dda0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
ddb0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70  _MAGIC_INIT || p
ddc0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
ddd0: 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20  GIC_RESET );..  
dde0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
ddf0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
de00: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
de10: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
de20: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
de30: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
de40: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
de50: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
de60: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
de70: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
de80: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
de90: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
dea0: 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  0; i<p->nMem; i+
deb0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
dec0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
ded0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
dee0: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
def0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
df00: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
df10: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
df20: 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  t;.  p->nChange 
df30: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
df40: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
df50: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
df60: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
df70: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  tement = 0;.  p-
df80: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d  >nFkConstraint =
df90: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
dfa0: 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d  PROFILE.  for(i=
dfb0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
dfc0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  ){.    p->aOp[i]
dfd0: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  .cnt = 0;.    p-
dfe0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
dff0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
e000: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
e010: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
e020: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20  e for execution 
e030: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
e040: 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61  me after.** crea
e050: 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c  ting the virtual
e060: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
e070: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
e080: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
e090: 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20  ating registers 
e0a0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
e0b0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
e0c0: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
e0d0: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
e0e0: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
e0f0: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
e100: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
e110: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
e120: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
e130: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
e140: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61  ay be called exa
e150: 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63  ctly once on eac
e160: 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  h virtual machin
e170: 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  e..** After this
e180: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e190: 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  ed the VM has be
e1a0: 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e  en "packaged" an
e1b0: 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f  d is ready.** to
e1c0: 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69   run.  After thi
e1d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e1e0: 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c  led, further cal
e1f0: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
e200: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
e210: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
e220: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
e230: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
e240: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
e250: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
e260: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
e270: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
e280: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
e290: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
e2a0: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
e2b0: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
e2c0: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
e2d0: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
e2e0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
e2f0: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
e300: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
e310: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
e320: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
e330: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
e340: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
e350: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
e360: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
e370: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
e3a0: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
e3b0: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
e3c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e3d0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
e3e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
e410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
e420: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
e450: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
e460: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
e470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e480: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
e490: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
e4a0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
e4d0: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
e4e0: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e510: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
e520: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
e530: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e550: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
e560: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
e570: 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20  eSpace x;       
e580: 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c   /* Reusable bul
e590: 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61  k memory */..  a
e5a0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
e5b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
e5c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e5d0: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
e5e0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
e5f0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
e600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e610: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
e620: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
e630: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
e640: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
e650: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
e660: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
e670: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
e680: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
e690: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
e6a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
e6b0: 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20  g;.  .  /* Each 
e6c0: 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65  cursor uses a me
e6d0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20  mory cell.  The 
e6e0: 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 63 75  first cursor (cu
e6f0: 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a  rsor 0) can.  **
e700: 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69   use aMem[0] whi
e710: 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77  ch is not otherw
e720: 69 73 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ise used by the 
e730: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41  VDBE program.  A
e740: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61  llocate.  ** spa
e750: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
e760: 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73   aMem[] for curs
e770: 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 74 65  ors 1 and greate
e780: 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  r..  ** See also
e790: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
e7a0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
e7b0: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66  += nCursor;.  if
e7c0: 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20  ( nCursor==0 && 
e7d0: 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b  nMem>0 ) nMem++;
e7e0: 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61    /* Space for a
e7f0: 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e  Mem[0] even if n
e800: 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a  ot used */..  /*
e810: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
e820: 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65  much reusable me
e830: 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mory is availabl
e840: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
e850: 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20  the.  ** opcode 
e860: 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78 74  array.  This ext
e870: 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ra memory will b
e880: 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f  e reallocated fo
e890: 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73  r other elements
e8a0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65  .  ** of the pre
e8b0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
e8c0: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e  .  */.  n = ROUN
e8d0: 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d  D8(sizeof(Op)*p-
e8e0: 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20  >nOp);          
e8f0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e900: 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73  opcode memory us
e910: 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65  ed */.  x.pSpace
e920: 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70   = &((u8*)p->aOp
e930: 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20  )[n];           
e940: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70      /* Unused op
e950: 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  code memory */. 
e960: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
e970: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e  YTE_ALIGNMENT(x.
e980: 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e  pSpace) );.  x.n
e990: 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e  Free = ROUNDDOWN
e9a0: 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c  8(pParse->szOpAl
e9b0: 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79  loc - n);  /* By
e9c0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65  tes of unused me
e9d0: 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74  mory */.  assert
e9e0: 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a  ( x.nFree>=0 );.
e9f0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
ea00: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26  BYTE_ALIGNMENT(&
ea10: 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65  x.pSpace[x.nFree
ea20: 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  ]) );..  resolve
ea30: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
ea40: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
ea50: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
ea60: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
ea70: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
ea80: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
ea90: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
eaa0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
eab0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
eac0: 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  }.  p->expired =
ead0: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
eae0: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
eaf0: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
eb00: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
eb10: 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20  cated in one or 
eb20: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
eb30: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
eb40: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
eb50: 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f  euse unused memo
eb60: 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20  ry at the .  ** 
eb70: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
eb80: 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20  e array.  If we 
eb90: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61  are unable to sa
eba0: 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79  tisfy all memory
ebb0: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e  .  ** requiremen
ebc0: 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68  ts by reusing th
ebd0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74  e opcode array t
ebe0: 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65  ail, then the se
ebf0: 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77  cond.  ** pass w
ec00: 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ill fill in the 
ec10: 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20  remainder using 
ec20: 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61  a fresh memory a
ec30: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
ec40: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
ec50: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
ec60: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
ec70: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
ec80: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
ec90: 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f  he leftover memo
eca0: 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ry at the end of
ecb0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
ecc0: 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67  y.  This can sig
ecd0: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
ece0: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
ecf0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
ed00: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
ed10: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
ed20: 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65   do {.    x.nNee
ed30: 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ded = 0;.    p->
ed40: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
ed50: 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e  e(&x, p->aMem, n
ed60: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Mem*sizeof(Mem))
ed70: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
ed80: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
ed90: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
eda0: 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70  eof(Mem));.    p
edb0: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
edc0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72  pace(&x, p->apAr
edd0: 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
ede0: 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70  em*));.    p->ap
edf0: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
ee00: 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e  (&x, p->apCsr, n
ee10: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
ee20: 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66  beCursor*));.#if
ee30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ee40: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
ee50: 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20  S.    p->anExec 
ee60: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
ee70: 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e   p->anExec, p->n
ee80: 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
ee90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
eea0: 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20 62  x.nNeeded==0 ) b
eeb0: 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61  reak;.    x.pSpa
eec0: 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20  ce = p->pFree = 
eed0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
eee0: 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64  awNN(db, x.nNeed
eef0: 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65  ed);.    x.nFree
ef00: 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20   = x.nNeeded;.  
ef10: 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c  }while( !db->mal
ef20: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
ef30: 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72  p->pVList = pPar
ef40: 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50  se->pVList;.  pP
ef50: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20  arse->pVList =  
ef60: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
ef70: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
ef80: 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  n;.  if( db->mal
ef90: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
efa0: 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20   p->nVar = 0;.  
efb0: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30    p->nCursor = 0
efc0: 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
efd0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
efe0: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
eff0: 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61  rsor;.    p->nVa
f000: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
f010: 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
f020: 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c  y(p->aVar, nVar,
f030: 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   db, MEM_Null);.
f040: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
f050: 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  em;.    initMemA
f060: 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  rray(p->aMem, nM
f070: 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65  em, db, MEM_Unde
f080: 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73  fined);.    mems
f090: 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20  et(p->apCsr, 0, 
f0a0: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
f0b0: 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
f0c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f0d0: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
f0e0: 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  US.    memset(p-
f0f0: 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e  >anExec, 0, p->n
f100: 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
f110: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
f120: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
f130: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
f140: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
f150: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
f160: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
f170: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
f180: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
f190: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
f1a0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
f1b0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
f1c0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
f1d0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
f1e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
f1f0: 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20  t( pCx->pBtx==0 
f200: 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  || pCx->eCurType
f210: 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
f220: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43 78  );.  switch( pCx
f230: 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20  ->eCurType ){.  
f240: 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 53    case CURTYPE_S
f250: 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ORTER: {.      s
f260: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
f270: 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
f280: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f290: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43      }.    case C
f2a0: 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a  URTYPE_BTREE: {.
f2b0: 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70        if( pCx->p
f2c0: 42 74 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Btx ){.        s
f2d0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
f2e0: 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20  (pCx->pBtx);.   
f2f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d       /* The pCx-
f300: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
f310: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
f320: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
f330: 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ts, by.        *
f340: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
f350: 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  . */.      }else
f360: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f370: 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  ( pCx->uc.pCurso
f380: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
f390: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f3a0: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e  eCursor(pCx->uc.
f3b0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
f3c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f3d0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f3e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f3f0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43  TABLE.    case C
f400: 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20  URTYPE_VTAB: {. 
f410: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
f420: 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20  b_cursor *pVCur 
f430: 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b  = pCx->uc.pVCur;
f440: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  .      const sql
f450: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
f460: 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56  dule = pVCur->pV
f470: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
f480: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75      assert( pVCu
f490: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30  r->pVtab->nRef>0
f4a0: 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d   );.      pVCur-
f4b0: 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a  >pVtab->nRef--;.
f4c0: 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78        pModule->x
f4d0: 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20  Close(pVCur);.  
f4e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f4f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
f500: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
f510: 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75  ursors in the cu
f520: 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a  rrent frame..*/.
f530: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
f540: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
f550: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
f560: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
f570: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
f580: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
f590: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
f5a0: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
f5b0: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
f5c0: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
f5d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f5e0: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
f5f0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
f600: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
f610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
f620: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
f630: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
f640: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
f650: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
f660: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
f670: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
f680: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
f690: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
f6a0: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
f6b0: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
f6c0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
f6d0: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
f6e0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
f6f0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
f700: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
f710: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63  = pFrame->v;.  c
f720: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
f730: 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51  me(v);.#ifdef SQ
f740: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
f750: 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d  _SCANSTATUS.  v-
f760: 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65  >anExec = pFrame
f770: 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66  ->anExec;.#endif
f780: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
f790: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
f7a0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
f7b0: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
f7c0: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
f7d0: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
f7e0: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
f7f0: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
f800: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
f810: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
f820: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
f830: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
f840: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
f850: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
f860: 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62  nChange;.  v->db
f870: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
f880: 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20  me->nDbChange;. 
f890: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f8a0: 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c  teAuxData(v->db,
f8b0: 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &v->pAuxData, -
f8c0: 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78  1, 0);.  v->pAux
f8d0: 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70  Data = pFrame->p
f8e0: 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d  AuxData;.  pFram
f8f0: 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b  e->pAuxData = 0;
f900: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
f910: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
f920: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
f930: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
f940: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
f950: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
f960: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
f970: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
f980: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
f990: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
f9a0: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
f9b0: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
f9c0: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
f9d0: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
f9e0: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
f9f0: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
fa00: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
fa10: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
fa20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
fa30: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
fa40: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
fa50: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
fa60: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
fa70: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
fa80: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
fa90: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
faa0: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
fab0: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
fac0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
fad0: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70  e(pFrame);.    p
fae0: 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
faf0: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
fb00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
fb10: 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20  ->nFrame==0 );. 
fb20: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
fb30: 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70  rame(p);.  if( p
fb40: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
fb50: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
fb60: 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  >aMem, p->nMem);
fb70: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
fb80: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
fb90: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
fba0: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
fbb0: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
fbc0: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
fbd0: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
fbe0: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
fbf0: 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
fc00: 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
fc10: 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
fc20: 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
fc30: 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61  .  if( p->pAuxDa
fc40: 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ta ) sqlite3Vdbe
fc50: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d  DeleteAuxData(p-
fc60: 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
fc70: 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  a, -1, 0);.  ass
fc80: 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
fc90: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
fca0: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
fcb0: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72  after a single r
fcc0: 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  un..*/.static vo
fcd0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
fce0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
fcf0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
fd00: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
fd10: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
fd20: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
fd30: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
fd40: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
fd50: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
fd60: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
fd70: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fd80: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
fd90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
fda0: 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
fdb0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
fdc0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
fdd0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
fde0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
fdf0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
fe00: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  <p->nMem; i++) a
fe10: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
fe20: 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
fe30: 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
fe40: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44  ndif..  sqlite3D
fe50: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
fe60: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
fe70: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
fe80: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
fe90: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
fea0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
feb0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
fec0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
fed0: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
fee0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
fef0: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
ff00: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
ff10: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
ff20: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
ff30: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
ff40: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
ff50: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
ff60: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
ff70: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
ff80: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
ff90: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
ffa0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
ffb0: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
ffc0: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
ffd0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
ffe0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
fff0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
10000 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
10010 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
10020 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
10030 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
10040 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10050 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
10060 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
10070 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
10080 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
10090 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
100a0 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
100b0 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
100c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
100d0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  N(db, sizeof(Mem
100e0 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
100f0 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
10100 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41  turn;.  initMemA
10110 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
10120 2c 20 6e 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d 5f  , n, p->db, MEM_
10130 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Null);.}../*.** 
10140 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
10150 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
10160 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
10170 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
10180 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
10190 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
101a0 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
101b0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
101c0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
101d0 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
101e0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
101f0 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
10200 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
10210 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
10220 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
10230 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
10240 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
10250 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
10260 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
10270 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
10280 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
10290 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
102a0 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
102b0 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
102c0 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
102d0 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
102e0 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
102f0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
10300 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
10330 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
10340 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10370 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
10380 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
10390 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
103c0 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
103d0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
103e0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
103f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
10400 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
10410 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
10420 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
10430 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
10440 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
10450 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
10460 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
10470 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
10480 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
10490 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
104a0 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
104b0 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
104c0 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
104d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
104e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
104f0 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
10500 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
10510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10520 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
10530 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
10540 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
10550 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
10560 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76  ->aColName[idx+v
10570 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  ar*p->nResColumn
10580 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
10590 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
105a0 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
105b0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
105c0 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72  , xDel);.  asser
105d0 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61  t( rc!=0 || !zNa
105e0 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d  me || (pColName-
105f0 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29  >flags&MEM_Term)
10600 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
10610 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
10620 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
10630 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
10640 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
10650 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
10660 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
10670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10680 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
10690 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
106a0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
106b0 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
106c0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
106d0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
106e0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
106f0 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
10700 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
10710 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
10720 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
10730 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
10740 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
10750 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
10760 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
10770 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
10780 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
10790 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
107b0 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69 64   that are candid
107c0 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70  ates for a two-p
107d0 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e  hase commit usin
107e0 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  g a.            
107f0 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72         ** master
10800 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  -journal */.  in
10810 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10820 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
10830 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
10840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10850 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
10860 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
10870 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
10880 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
10890 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
108a0 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
108b0 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
108c0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
108d0 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
108e0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
108f0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
10900 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
10910 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
10920 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
10930 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
10940 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
10950 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
10960 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
10970 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
10980 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
10990 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
109a0 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
109b0 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
109c0 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
109d0 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
109e0 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
109f0 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
10a00 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
10a10 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
10a20 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
10a30 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
10a40 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
10a50 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
10a60 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
10a70 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
10a80 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
10a90 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
10aa0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
10ab0 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
10ac0 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
10ad0 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
10ae0 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
10af0 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
10b00 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
10b10 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
10b20 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
10b30 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
10b40 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
10b50 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
10b60 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
10b70 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
10b80 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
10b90 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
10ba0 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
10bb0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10bc0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
10bd0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
10be0 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
10bf0 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f      /* Whether o
10c00 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  r not a database
10c10 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61   might need a ma
10c20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70  ster journal dep
10c30 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20  ends upon.      
10c40 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d  ** its journal m
10c50 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72  ode (among other
10c60 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20   things).  This 
10c70 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65  matrix determine
10c80 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  s which.      **
10c90 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75   journal modes u
10ca0 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  se a master jour
10cb0 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f  nal and which do
10cc0 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74   not */.      st
10cd0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d  atic const u8 aM
10ce0 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20  JNeeded[] = {.  
10cf0 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20        /* DELETE 
10d00 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20    */  1,.       
10d10 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f   /* PERSIST   */
10d20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   1,.        /* O
10d30 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  FF       */ 0,. 
10d40 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41         /* TRUNCA
10d50 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  TE  */ 1,.      
10d60 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a    /* MEMORY    *
10d70 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
10d80 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20  WAL       */ 0. 
10d90 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61       };.      Pa
10da0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f  ger *pPager;   /
10db0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
10dc0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
10dd0 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
10de0 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
10df0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
10e00 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  t);.      pPager
10e10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
10e20 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
10e30 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
10e40 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41  safety_level!=PA
10e50 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
10e60 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d  OFF.       && aM
10e70 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50  JNeeded[sqlite3P
10e80 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerGetJournalMo
10e90 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20  de(pPager)].    
10ea0 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61 73    ){ .        as
10eb0 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20 20  sert( i!=1 );.  
10ec0 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a        nTrans++;.
10ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
10ee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
10ef0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
10f00 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
10f10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
10f20 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
10f30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10f40 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10f50 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
10f60 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
10f70 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10f80 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
10f90 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
10fa0 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
10fb0 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
10fc0 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
10fd0 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
10fe0 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
10ff0 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
11000 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11020 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
11030 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  THOOK;.    }.  }
11040 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
11050 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
11060 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
11070 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
11080 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
11090 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
110a0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
110b0 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
110c0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
110d0 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
110e0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
110f0 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
11100 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
11110 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
11120 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
11130 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
11140 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
11150 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
11160 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
11170 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
11180 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
11190 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
111a0 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
111b0 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
111c0 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
111d0 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
111e0 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
111f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
11200 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11210 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
11220 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
11230 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
11240 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11250 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11260 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11270 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11280 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11290 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
112a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
112b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
112c0 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
112d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
112e0 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
112f0 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
11300 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
11310 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
11320 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
11330 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
11340 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11350 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
11360 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
11370 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
11380 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
11390 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
113a0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
113b0 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
113c0 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
113d0 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
113e0 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
113f0 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
11400 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
11410 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11420 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
11430 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
11440 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
11450 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11460 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11470 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
11480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
11490 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
114a0 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  o(pBt, 0);.     
114b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
114c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
114d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
114e0 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
114f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
11500 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
11510 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
11520 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
11530 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
11540 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
11550 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
11560 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
11570 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
11580 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
11590 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c  mitted atomicall
115a0 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
115b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
115c0 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
115d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
115e0 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
115f0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
11600 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
11610 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
11620 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
11630 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
11640 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
11650 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
11660 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
11670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
11680 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
11690 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
116a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
116b0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
116c0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
116d0 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
116e0 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
116f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11700 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
11710 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
11720 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
11730 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
11740 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
11750 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
11760 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
11770 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
11780 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
11790 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
117a0 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  KPT;.    do {.  
117b0 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
117c0 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
117d0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
117e0 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
117f0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
11800 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
11810 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
11820 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
11830 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
11840 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
11850 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
11860 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
11870 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
11880 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
11890 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
118a0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
118b0 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
118c0 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
118d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
118e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
118f0 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
11900 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
11910 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
11920 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
11930 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11940 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
11950 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
11960 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11990 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
119a0 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
119b0 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
119c0 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
119d0 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
119e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
119f0 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
11a00 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
11a10 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
11a20 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
11a30 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
11a40 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
11a50 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
11a60 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
11a70 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
11a80 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
11a90 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
11aa0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
11ac0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
11ad0 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
11ae0 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
11af0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
11b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
11b10 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
11b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11b30 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
11b40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
11b50 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
11b60 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
11b70 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
11b80 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
11b90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11ba0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
11bb0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
11bc0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11bd0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
11be0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
11bf0 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
11c00 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
11c10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11c30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
11c40 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
11c50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
11c60 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
11c70 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
11c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
11c90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11ca0 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
11cb0 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
11cc0 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
11cd0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
11ce0 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
11cf0 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
11d00 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11d10 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
11d20 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
11d30 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
11d40 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
11d50 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
11d60 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
11d70 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
11d80 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
11d90 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
11da0 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
11db0 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
11dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
11dd0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
11de0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
11df0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11e00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
11e10 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
11e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
11e30 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
11e40 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11e50 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
11e60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
11e70 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
11e80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
11e90 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
11ea0 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
11eb0 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
11ec0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
11ed0 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
11ee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11ef0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
11f00 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
11f10 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
11f20 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
11f30 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
11f40 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11f50 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
11f60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11f80 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11f90 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11fb0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11fc0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
11fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
11fe0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12000 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12010 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12020 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
12030 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12040 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
12050 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
12060 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
12070 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
12080 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
12090 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d    */.    if( 0==
120a0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
120b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
120c0 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
120d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
120e0 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
120f0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
12100 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
12110 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
12120 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
12130 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12140 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
12150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12160 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
12170 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
12180 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12190 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
121a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
121b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
121c0 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
121d0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
121e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
121f0 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
12200 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
12210 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
12220 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
12230 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
12240 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
12250 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
12260 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
12270 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12280 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
12290 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
122a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
122b0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
122c0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
122d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
122e0 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
122f0 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
12300 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
12310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12320 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
12330 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
12340 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
12350 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
12360 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12370 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
12380 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
12390 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
123a0 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
123b0 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
123c0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
123d0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
123e0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
123f0 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
12400 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
12410 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12420 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
12430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12440 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
12450 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
12460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12470 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12480 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
12490 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
124a0 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
124b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
124c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
124d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
124e0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
124f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12500 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
12510 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12520 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
12530 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
12540 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
12550 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
12560 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
12570 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
12580 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
12590 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
125a0 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
125b0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
125c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
125d0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
125e0 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
125f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12600 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
12610 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
12620 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
12630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12640 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
12650 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
12660 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
12670 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
12680 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
12690 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
126a0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
126b0 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
126c0 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
126d0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
126e0 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
126f0 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
12700 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
12710 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
12720 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
12730 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
12740 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
12750 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
12760 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
12770 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
12780 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
12790 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
127a0 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
127b0 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
127c0 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
127d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
127e0 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
127f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
12800 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
12810 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
12820 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12830 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
12840 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
12850 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12860 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
12870 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12880 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
12890 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
128a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
128b0 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
128c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
128d0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
128e0 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
128f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12900 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
12910 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
12920 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
12930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12940 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
12950 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
12960 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62  the sqlite3.nVdb
12970 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61  eActive count va
12980 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
12990 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
129a0 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
129b0 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
129c0 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
129d0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
129e0 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
129f0 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
12a00 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
12a10 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
12a20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
12a30 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
12a40 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
12a50 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
12a60 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
12a70 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
12a80 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
12a90 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
12aa0 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
12ab0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
12ac0 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
12ad0 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
12ae0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
12af0 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69   nWrite = 0;.  i
12b00 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  nt nRead = 0;.  
12b10 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
12b20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
12b30 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d   if( sqlite3_stm
12b40 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f  t_busy((sqlite3_
12b50 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20  stmt*)p) ){.    
12b60 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
12b70 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
12b80 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
12b90 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
12ba0 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a  ader ) nRead++;.
12bb0 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
12bc0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
12bd0 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e  sert( cnt==db->n
12be0 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20  VdbeActive );.  
12bf0 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
12c00 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
12c10 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61  ;.  assert( nRea
12c20 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  d==db->nVdbeRead
12c30 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
12c40 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
12c50 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
12c60 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
12c70 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
12c80 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
12c90 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
12ca0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
12cb0 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
12cc0 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
12cd0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
12ce0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12cf0 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
12d00 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
12d10 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
12d20 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
12d30 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
12d40 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
12d50 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
12d60 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
12d70 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
12d80 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
12d90 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
12da0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
12db0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12dc0 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
12dd0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
12de0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
12df0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
12e00 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
12e10 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12e20 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73 65  NE int vdbeClose
12e30 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
12e40 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
12e50 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
12e60 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
12e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12e80 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
12e90 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
12ea0 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
12eb0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4f  1;..  assert( eO
12ec0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12ed0 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
12ee0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
12ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
12f00 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
12f10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
12f20 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
12f30 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
12f40 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66  vepoint) );..  f
12f50 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
12f60 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e  b; i++){ .    in
12f70 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
12f80 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  K;.    Btree *pB
12f90 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12fa0 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
12fb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
12fc0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
12fd0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
12fe0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
12ff0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
13000 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
13010 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
13020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13030 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
13040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
13050 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
13060 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
13070 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
13080 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
13090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
130a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
130b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
130c0 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
130d0 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61  }.  }.  db->nSta
130e0 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69  tement--;.  p->i
130f0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
13100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13110 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 65  _OK ){.    if( e
13120 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
13130 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
13140 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
13150 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
13160 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13170 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
13180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
13190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
131a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
131b0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
131c0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
131d0 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
131e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
131f0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
13200 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
13210 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
13220 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
13230 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  e the .  ** data
13240 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
13250 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
13260 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
13270 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
13280 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  n .  ** the stat
13290 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
132a0 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
132b0 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56  /.  if( eOp==SAV
132c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
132d0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  ){.    db->nDefe
132e0 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
132f0 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
13300 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
13310 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
13320 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20  efImmCons;.  }. 
13330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
13340 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
13350 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
13360 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
13370 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61   if( p->db->nSta
13380 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
13390 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72  atement ){.    r
133a0 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65 53  eturn vdbeCloseS
133b0 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29  tatement(p, eOp)
133c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
133d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
133e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
133f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
13400 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
13410 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
13420 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
13430 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13440 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
13450 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
13460 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
13470 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
13480 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
13490 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
134a0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
134b0 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
134c0 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
134d0 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
134e0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
134f0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
13500 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
13510 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
13520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
13530 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
13540 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
13550 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
13560 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
13570 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
13580 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
13590 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
135a0 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
135b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
135c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
135d0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
135e0 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
135f0 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
13600 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
13610 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
13620 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
13630 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
13640 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
13650 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
13660 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
13670 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
13680 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
13690 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
136a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
136b0 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
136c0 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
136d0 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
136e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
136f0 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e  rror(p, "FOREIGN
13700 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
13710 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
13720 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13730 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
13740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
13750 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
13760 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
13770 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
13780 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
13790 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
137a0 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
137b0 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
137c0 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
137d0 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
137e0 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
137f0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
13800 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
13810 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
13820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13830 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
13840 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
13850 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
13860 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
13870 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
13880 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
13890 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
138a0 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
138b0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
138c0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
138d0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
138e0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
138f0 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
13900 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
13910 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
13920 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
13930 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
13940 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
13950 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
13960 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
13970 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
13980 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
13990 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
139a0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
139b0 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
139c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
139f0 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
13a00 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
13a10 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13a20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
13a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
13a40 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
13a50 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
13a60 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
13a70 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
13a80 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
13a90 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
13aa0 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
13ab0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
13ac0 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
13ad0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
13ae0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
13af0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
13b00 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
13b10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
13b20 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
13b30 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
13b40 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
13b50 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
13b60 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
13b70 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
13b80 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
13b90 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
13ba0 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
13bb0 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
13bc0 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
13bd0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
13be0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13bf0 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
13c00 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
13c10 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
13c20 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
13c30 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
13c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
13c50 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  */..  if( p->mag
13c60 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
13c70 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
13c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13c90 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13ca0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
13cb0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
13cc0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63  EM_BKPT;.  }.  c
13cd0 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
13ce0 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  );.  checkActive
13cf0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
13d00 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
13d10 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
13d20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
13d30 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
13d40 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
13d50 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
13d60 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
13d70 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
13d80 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13d90 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
13da0 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
13db0 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
13dc0 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
13dd0 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
13de0 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
13df0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
13e00 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
13e10 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
13e20 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
13e30 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
13e40 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
13e50 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
13e60 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
13e70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
13e80 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
13e90 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
13ea0 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
13eb0 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
13ec0 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
13ed0 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
13ee0 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
13ef0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
13f00 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13f30 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
13f40 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
13f50 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
13f60 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
13f70 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
13f80 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
13f90 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
13fa0 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
13fb0 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
13fc0 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
13fd0 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
13fe0 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
13ff0 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
14000 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
14010 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
14020 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
14030 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
14040 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
14050 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
14060 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
14070 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
14080 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
14090 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
140a0 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
140b0 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
140c0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
140d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
140e0 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
140f0 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
14100 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
14110 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
14120 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
14130 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
14140 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
14150 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
14160 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
14170 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
14180 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
14190 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
141a0 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
141b0 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
141c0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
141d0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
141e0 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
141f0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
14200 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
14210 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
14220 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
14230 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
14240 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
14250 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
14260 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
14270 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
14280 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
14290 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
142a0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
142b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
142c0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
142d0 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
142e0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
142f0 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
14300 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
14310 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
14320 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
14330 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
14340 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
14350 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
14360 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
14370 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
14380 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
14390 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
143a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
143b0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
143c0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
143d0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
143e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
143f0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
14400 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14410 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
14420 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  for immediate fo
14430 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
14440 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
14450 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14460 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
14470 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
14480 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
14490 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
144a0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
144b0 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
144c0 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
144d0 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56  writer .    ** V
144e0 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69  M, then we do ei
144f0 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
14500 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
14510 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
14520 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
14530 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
14540 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
14550 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
14560 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
14570 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
14580 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  ve has occurred.
14590 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
145a0 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53   !sqlite3VtabInS
145b0 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26  ync(db) .     &&
145c0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
145d0 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64  .     && db->nVd
145e0 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61  beWrite==(p->rea
145f0 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29  dOnly==0) .    )
14600 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
14610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14620 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
14630 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
14640 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
14650 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14660 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
14670 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  p, 1);.        i
14680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
146a0 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f  ( NEVER(p->readO
146b0 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
146c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
146d0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
146e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
146f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
14700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14710 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
14720 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
14730 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
14740 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
14750 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
14760 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
14770 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
14780 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
14790 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
147a0 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
147b0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
147c0 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
147d0 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
147e0 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
147f0 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
14800 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
14810 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
14820 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
14830 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
14840 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
14850 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
14860 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
14870 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14880 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
14890 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  && p->readOnly )
148a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
148b0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
148c0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
148d0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
148e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
148f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14900 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
14910 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
14920 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
14930 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
14940 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  OK);.          p
14950 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14960 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14970 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
14980 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
14990 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
149a0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
149b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
149c0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
149d0 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20  E_DeferFKs;.    
149e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
149f0 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
14a00 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
14a10 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
14a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14a30 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14a40 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
14a50 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
14a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14a70 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
14a80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
14a90 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
14aa0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
14ab0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14ac0 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
14ad0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
14ae0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
14af0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
14b00 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
14b10 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
14b20 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
14b30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
14b40 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
14b50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
14b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14b70 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14b80 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14b90 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
14ba0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14bb0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
14bc0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
14bd0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
14be0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
14bf0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14c00 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
14c10 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
14c20 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
14c30 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
14c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
14c50 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
14c60 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
14c70 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
14c80 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
14c90 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
14ca0 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
14cb0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
14cc0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
14cd0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
14ce0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
14cf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
14d00 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
14d10 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
14d20 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
14d30 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
14d40 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
14d50 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
14d60 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
14d70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
14d80 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
14d90 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
14da0 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
14db0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14dc0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14dd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
14de0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
14df0 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
14e00 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14e10 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
14e20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14e30 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
14e40 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
14e50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
14e60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14e70 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14e80 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14e90 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14ea0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14eb0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14ec0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14ed0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
14ee0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14f00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
14f10 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
14f20 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
14f30 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
14f40 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
14f50 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
14f60 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
14f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
14f80 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
14f90 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
14fa0 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
14fb0 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
14fc0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14fd0 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
14fe0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
14ff0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
15000 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
15010 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
15020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
15030 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
15040 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
15050 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
15060 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
15070 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
15080 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
15090 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
150a0 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
150b0 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
150c0 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
150d0 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
150e0 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
150f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
15100 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
15110 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
15120 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
15130 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
15140 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
15150 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
15160 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
15170 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
15180 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
15190 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
151a0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
151b0 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
151c0 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
151d0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
151e0 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
151f0 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
15200 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
15210 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
15220 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  (db);.  if( db->
15230 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15240 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
15250 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15260 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
15270 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
15280 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
15290 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
152a0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
152b0 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
152c0 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
152d0 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
152e0 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
152f0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
15300 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
15310 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
15320 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
15330 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
15340 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
15350 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
15360 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
15370 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
15380 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
15390 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
153a0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
153b0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
153c0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
153d0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
153e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
153f0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
15400 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
15410 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
15420 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
15430 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
15440 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
15450 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
15460 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
15470 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
15480 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
15490 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
154a0 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
154b0 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
154c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
154d0 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
154e0 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
154f0 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
15500 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
15510 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
15520 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
15530 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
15540 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
15550 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
15560 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
15570 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
15580 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
15590 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
155a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
155b0 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
155c0 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
155d0 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
155e0 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
155f0 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
15600 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
15610 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
15620 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
15630 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
15640 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
15650 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
15660 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
15670 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  {.    db->bBenig
15680 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73  nMalloc++;.    s
15690 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
156a0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
156b0 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
156c0 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
156d0 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
156e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
156f0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
15700 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
15710 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
15720 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
15730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
15740 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
15750 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
15760 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d  alloc--;.    db-
15770 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
15780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15790 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
157a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
157b0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
157c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
157d0 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
157e0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
157f0 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
15800 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
15810 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
15820 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
15830 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
15840 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
15850 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
15860 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15870 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
15880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15890 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
158a0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
158b0 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
158c0 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
158d0 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
158e0 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
158f0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
15900 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
15910 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
15920 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15930 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
15940 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15950 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
15960 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
15970 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
15980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
15990 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
159a0 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
159b0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
159c0 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
159d0 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
159e0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
159f0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
15a00 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
15a10 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
15a20 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
15a30 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
15a40 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
15a50 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
15a60 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
15a70 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
15a80 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
15a90 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
15aa0 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
15ab0 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
15ac0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
15ad0 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
15ae0 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
15af0 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
15b00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
15b10 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
15b20 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
15b30 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
15b40 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
15b50 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
15b60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15b70 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
15b80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15b90 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
15ba0 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
15bb0 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
15bc0 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
15bd0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
15be0 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
15bf0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
15c00 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
15c10 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
15c20 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
15c30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15c40 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
15c50 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
15c60 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
15c70 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
15c80 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
15c90 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
15ca0 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
15cb0 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
15cc0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15cd0 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
15ce0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
15cf0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
15d00 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
15d10 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
15d20 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
15d30 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
15d40 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
15d50 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
15d60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
15d70 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
15d80 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
15d90 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
15da0 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
15db0 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
15dc0 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
15dd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15de0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15df0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
15e00 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
15e10 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
15e20 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
15e30 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
15e40 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
15e50 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
15e60 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
15e70 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
15e80 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
15e90 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
15ea0 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
15eb0 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
15ec0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
15ed0 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
15ee0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
15ef0 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
15f00 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
15f10 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
15f20 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
15f30 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
15f40 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
15f50 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
15f60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15f70 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
15f80 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
15f90 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
15fa0 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
15fb0 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
15fc0 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
15fd0 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
15fe0 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
15ff0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
16000 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
16010 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
16020 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
16030 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
16040 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
16050 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
16060 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
16070 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
16080 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
16090 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
160a0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
160b0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
160c0 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
160d0 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
160e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
160f0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
16100 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
16110 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
16120 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
16130 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16140 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
16150 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
16160 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
16170 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
16180 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
16190 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
161a0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
161b0 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
161c0 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
161d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
161e0 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
161f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
16200 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
16210 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
16220 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
16230 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
16240 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
16250 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
16260 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
16270 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
16280 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
16290 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
162a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
162b0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
162c0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
162d0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
162e0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
162f0 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
16300 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
16310 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
16320 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
16330 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
16340 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
16350 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
16360 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
16370 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
16380 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65  ndif.  p->iCurre
16390 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  ntTime = 0;.  p-
163a0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
163b0 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74  GIC_RESET;.  ret
163c0 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
163d0 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
163e0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
163f0 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
16400 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
16410 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
16420 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
16430 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
16440 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
16450 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
16460 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
16470 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
16480 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
16490 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
164a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
164b0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
164c0 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
164d0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
164e0 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
164f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
16500 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
16510 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
16520 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
16530 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
16540 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
16550 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16560 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70  If parameter iOp
16570 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
16580 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ro, then invoke 
16590 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
165a0 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69  or.** all auxili
165b0 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
165c0 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  s currently cach
165d0 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
165e0 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69  sed as.** the fi
165f0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
16600 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69  .** Or, if iOp i
16610 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
16620 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
16630 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75   then the destru
16640 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  ctor is.** only 
16650 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73  invoked for thos
16660 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
16670 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65   pointers create
16680 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a  d by the user .*
16690 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  * function invok
166a0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e  ed by the OP_Fun
166b0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20  ction opcode at 
166c0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20  instruction iOp 
166d0 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c  of .** VM pVdbe,
166e0 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69   and only then i
166f0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  f:.**.**    * th
16700 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e  e associated fun
16710 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
16720 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c  is the 32nd or l
16730 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a  ater (counting.*
16740 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74  *      from left
16750 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a   to right), or.*
16760 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f  *.**    * the co
16770 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
16780 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b  in argument mask
16790 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65   is clear (where
167a0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20   the first.**   
167b0 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61     function para
167c0 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  meter correspond
167d0 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29  s to bit 0 etc.)
167e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
167f0 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
16800 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ta(sqlite3 *db, 
16810 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e  AuxData **pp, in
16820 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
16830 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29  {.  while( *pp )
16840 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70  {.    AuxData *p
16850 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69  Aux = *pp;.    i
16860 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20  f( (iOp<0).     
16870 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69  || (pAux->iOp==i
16880 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72  Op && (pAux->iAr
16890 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26  g>31 || !(mask &
168a0 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d   MASKBIT32(pAux-
168b0 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b  >iArg)))).    ){
168c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
168d0 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20   pAux->iArg==31 
168e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  );.      if( pAu
168f0 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
16900 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
16910 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
16920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
16930 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
16940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
16950 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b  bFree(db, pAux);
16960 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16970 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
16980 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
16990 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
169a0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
169b0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
169c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
169d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
169e0 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a  * except for obj
169f0 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63  ect itself, whic
16a00 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a  h is preserved..
16a10 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
16a20 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
16a30 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
16a40 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
16a50 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
16a60 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
16a70 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
16a80 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
16a90 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
16aa0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
16ab0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16ac0 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f   and frees the o
16ad0 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f  bject itself..*/
16ae0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16af0 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c  eClearObject(sql
16b00 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
16b10 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
16b20 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
16b30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
16b40 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
16b50 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
16b60 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
16b70 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
16b80 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
16b90 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
16ba0 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
16bb0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
16bc0 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
16bd0 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
16be0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
16bf0 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
16c00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16c10 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
16c20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
16c30 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
16c40 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
16c50 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
16c60 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71  p->nVar);.    sq
16c70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16c80 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20  p->pVList);.    
16c90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16ca0 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d  , p->pFree);.  }
16cb0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
16cc0 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
16cd0 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
16ce0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16cf0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
16d00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16d10 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53  >zSql);.#ifdef S
16d20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
16d30 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 7b  T_SCANSTATUS.  {
16d40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
16d50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
16d60 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  can; i++){.     
16d70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16d80 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a  b, p->aScan[i].z
16d90 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
16da0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16db0 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20  b, p->aScan);.  
16dc0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
16dd0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
16de0 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
16df0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
16e00 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
16e10 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
16e20 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
16e30 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
16e40 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
16e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16e60 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
16e70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
16e80 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
16e90 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
16ea0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
16eb0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
16ec0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
16ed0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
16ee0 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
16ef0 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
16f00 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
16f10 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
16f20 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
16f30 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
16f40 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
16f50 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
16f60 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
16f70 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
16f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
16f90 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70  rsor "p" has a p
16fa0 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72  ending seek oper
16fb0 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ation that has n
16fc0 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63  ot yet been.** c
16fd0 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65  arried out.  See
16fe0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77  k the cursor now
16ff0 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
17000 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
17010 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
17020 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
17030 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
17040 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
17050 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
17060 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
17070 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
17080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17090 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  T.  extern int s
170a0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
170b0 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  unt;.#endif.  as
170c0 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65  sert( p->deferre
170d0 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73  dMoveto );.  ass
170e0 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
170f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17100 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
17110 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20  E_BTREE );.  rc 
17120 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
17130 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
17140 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  uc.pCursor, 0, p
17150 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
17160 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20  0, &res);.  if( 
17170 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17180 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72    if( res!=0 ) r
17190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
171a0 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65  RUPT_BKPT;.#ifde
171b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
171c0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
171d0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
171e0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
171f0 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  to = 0;.  p->cac
17200 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
17210 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e  _STALE;.  return
17220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17230 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68  *.** Something h
17240 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20  as moved cursor 
17250 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65  "p" out of place
17260 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77  .  Maybe the row
17270 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74   it was.** point
17280 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65  ed to was delete
17290 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
172a0 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74   it.  Or maybe t
172b0 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20  he btree was.** 
172c0 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61  rebalanced.  Wha
172d0 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c  tever the cause,
172e0 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20   try to restore 
172f0 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65  "p" to the place
17300 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73   it.** is suppos
17310 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e  ed to be pointin
17320 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77  g.  If the row w
17330 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  as deleted out f
17340 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a  rom under the.**
17350 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65   cursor, set the
17360 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
17370 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a   to a NULL row..
17380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17390 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
173a0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
173b0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
173c0 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e    int isDifferen
173d0 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65  tRow, rc;.  asse
173e0 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
173f0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
17400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75  ;.  assert( p->u
17410 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
17420 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17430 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
17440 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
17450 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  or) );.  rc = sq
17460 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17470 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43  Restore(p->uc.pC
17480 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72  ursor, &isDiffer
17490 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61  entRow);.  p->ca
174a0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
174b0 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69  E_STALE;.  if( i
174c0 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20  sDifferentRow ) 
174d0 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
174e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
174f0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65  /*.** Check to e
17500 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
17510 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
17520 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
17530 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62  sor.** if need b
17540 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49  e.  Return any I
17550 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  /O error from th
17560 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74  e restore operat
17570 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
17580 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
17590 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20  tore(VdbeCursor 
175a0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
175b0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
175c0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69  YPE_BTREE );.  i
175d0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
175e0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
175f0 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a  >uc.pCursor) ){.
17600 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
17610 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
17620 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17640 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
17650 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
17660 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
17670 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
17680 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
17690 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
176a0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
176b0 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
176c0 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
176d0 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
176e0 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
176f0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
17700 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
17710 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
17720 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
17730 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
17740 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
17750 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
17760 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
17770 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
17780 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
17790 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
177a0 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
177b0 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
177c0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
177d0 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
177e0 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
177f0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
17800 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
17810 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
17820 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
17830 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
17840 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
17850 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
17860 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
17870 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
17880 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17890 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
178a0 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
178b0 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70  o(VdbeCursor **p
178c0 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a  p, int *piCol){.
178d0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20    VdbeCursor *p 
178e0 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e  = *pp;.  if( p->
178f0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
17900 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69  E_BTREE ){.    i
17910 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
17920 76 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e  veto ){.      in
17930 74 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69 66  t iMap;.      if
17940 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20  ( p->aAltMap && 
17950 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d  (iMap = p->aAltM
17960 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20  ap[1+*piCol])>0 
17970 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
17980 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a   p->pAltCursor;.
17990 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
179a0 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20   iMap - 1;.     
179b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
179c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
179d0 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
179e0 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70  DeferredMoveto(p
179f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17a00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
17a10 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
17a20 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
17a30 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
17a40 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
17a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17a70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
17a80 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
17a90 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
17aa0 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
17ab0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
17ac0 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
17ad0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17ae0 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
17af0 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29  3VdbeSerialPut()
17b00 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
17b10 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a  erialGet().**.**
17b20 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
17b30 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
17b40 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
17b50 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
17b60 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
17b70 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
17b80 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
17b90 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
17ba0 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
17bb0 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
17bc0 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
17bd0 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
17be0 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
17bf0 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
17c00 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
17c10 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
17c20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
17c30 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
17c40 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
17c50 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
17c60 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
17c70 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
17c80 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
17c90 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
17ca0 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
17cb0 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
17cc0 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
17cd0 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
17ce0 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
17cf0 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
17d00 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
17d10 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
17d20 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
17d30 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
17d40 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74  ata blob separat
17d50 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
17d60 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
17d70 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
17d80 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
17d90 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
17da0 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
17db0 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
17dc0 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
17dd0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
17de0 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
17df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
17e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
17e10 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
17e20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
17e30 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
17e40 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
17e50 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
17e60 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17e70 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
17ea0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
17eb0 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17ee0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17ef0 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
17f00 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
17f10 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17f20 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
17f50 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17f60 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
17f80 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
17f90 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
17fa0 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
17fb0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
17fc0 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
17fd0 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
17ff0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
18000 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
18010 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
18020 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
18030 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
18040 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
18050 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
18080 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
18090 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
180a0 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
180b0 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
180c0 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
180d0 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
180e0 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
180f0 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
18100 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
18110 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
18120 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
18130 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
18140 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
18150 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
18160 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
18170 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18180 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
18190 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
181a0 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
181b0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
181c0 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
181d0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
181e0 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29  rmat, u32 *pLen)
181f0 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
18200 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75  pMem->flags;.  u
18210 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  32 n;..  assert(
18220 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66   pLen!=0 );.  if
18230 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
18240 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
18250 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  0;.    return 0;
18260 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
18270 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
18280 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
18290 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
182a0 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
182b0 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
182c0 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
182d0 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
182e0 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
182f0 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
18300 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
18310 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75  ( i<0 ){.      u
18320 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = ~i;.    }else
18330 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
18340 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
18350 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28  127 ){.      if(
18360 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c   (i&1)==i && fil
18370 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
18380 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30         *pLen = 0
18390 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
183a0 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20   8+(u32)u;.     
183b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
183c0 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  *pLen = 1;.     
183d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
183e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
183f0 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a  f( u<=32767 ){ *
18400 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e  pLen = 2; return
18410 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   2; }.    if( u<
18420 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65  =8388607 ){ *pLe
18430 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b  n = 3; return 3;
18440 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31   }.    if( u<=21
18450 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65  47483647 ){ *pLe
18460 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b  n = 4; return 4;
18470 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41   }.    if( u<=MA
18480 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e  X_6BYTE ){ *pLen
18490 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20   = 6; return 5; 
184a0 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b  }.    *pLen = 8;
184b0 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
184c0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
184d0 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a  EM_Real ){.    *
184e0 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65  pLen = 8;.    re
184f0 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
18500 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
18510 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
18520 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
18530 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73  EM_Blob) );.  as
18540 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30  sert( pMem->n>=0
18550 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70   );.  n = (u32)p
18560 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
18570 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
18580 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
18590 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  >u.nZero;.  }.  
185a0 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74  *pLen = n;.  ret
185b0 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20  urn ((n*2) + 12 
185c0 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74  + ((flags&MEM_St
185d0 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r)!=0));.}../*.*
185e0 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20  * The sizes for 
185f0 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73  serial types les
18600 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74  s than 128.*/.st
18610 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71  atic const u8 sq
18620 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
18630 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  zes[] = {.      
18640 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20    /*  0   1   2 
18650 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36 20    3   4   5   6 
18660 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20    7   8   9 */  
18670 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c   ./*   0 */   0,
18680 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c    1,  2,  3,  4,
18690 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c    6,  8,  8,  0,
186a0 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20    0,./*  10 */  
186b0 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
186c0 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20   1,  1,  2,  2, 
186d0 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a   3,  3,./*  20 *
186e0 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20  /   4,  4,  5,  
186f0 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20  5,  6,  6,  7,  
18700 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33  7,  8,  8,./*  3
18710 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30  0 */   9,  9, 10
18720 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32  , 10, 11, 11, 12
18730 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a  , 12, 13, 13,./*
18740 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c    40 */  14, 14,
18750 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c   15, 15, 16, 16,
18760 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c   17, 17, 18, 18,
18770 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20  ./*  50 */  19, 
18780 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20  19, 20, 20, 21, 
18790 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20  21, 22, 22, 23, 
187a0 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32  23,./*  60 */  2
187b0 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32  4, 24, 25, 25, 2
187c0 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32  6, 26, 27, 27, 2
187d0 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f  8, 28,./*  70 */
187e0 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30    29, 29, 30, 30
187f0 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32  , 31, 31, 32, 32
18800 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30  , 33, 33,./*  80
18810 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c   */  34, 34, 35,
18820 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c   35, 36, 36, 37,
18830 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20   37, 38, 38,./* 
18840 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20   90 */  39, 39, 
18850 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20  40, 40, 41, 41, 
18860 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a  42, 42, 43, 43,.
18870 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34  /* 100 */  44, 4
18880 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34  4, 45, 45, 46, 4
18890 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34  6, 47, 47, 48, 4
188a0 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39  8,./* 110 */  49
188b0 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31  , 49, 50, 50, 51
188c0 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33  , 51, 52, 52, 53
188d0 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20  , 53,./* 120 */ 
188e0 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c   54, 54, 55, 55,
188f0 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a   56, 56, 57, 57.
18900 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  };../*.** Return
18910 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
18920 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
18930 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
18940 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
18950 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
18960 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18970 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
18980 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
18990 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20  l_type>=128 ){. 
189a0 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
189b0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
189c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
189d0 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  t( serial_type<1
189e0 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  2 .            |
189f0 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  | sqlite3SmallTy
18a00 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18a10 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79  ype]==(serial_ty
18a20 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20  pe - 12)/2 );.  
18a30 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18a40 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
18a50 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
18a60 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  .}.u8 sqlite3Vdb
18a70 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79  eOneByteSerialTy
18a80 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f  peLen(u8 serial_
18a90 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  type){.  assert(
18aa0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38   serial_type<128
18ab0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
18ac0 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
18ad0 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
18ae0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77    .}../*.** If w
18af0 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
18b00 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
18b10 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
18b20 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
18b30 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
18b40 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
18b50 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
18b60 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
18b70 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
18b80 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
18b90 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
18ba0 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
18bb0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
18bc0 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
18bd0 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
18be0 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
18bf0 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
18c00 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
18c10 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
18c20 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
18c30 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
18c40 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
18c50 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
18c60 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
18c70 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
18c80 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
18c90 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
18ca0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
18cb0 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
18cc0 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
18cd0 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
18ce0 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
18cf0 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
18d00 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
18d10 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
18d20 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
18d30 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
18d40 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
18d50 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
18d60 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
18d70 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
18d80 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
18d90 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
18da0 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
18db0 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
18dc0 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
18dd0 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
18de0 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
18df0 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
18e00 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
18e10 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
18e20 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
18e30 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
18e40 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
18e50 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
18e60 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
18e70 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
18e80 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
18e90 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
18ea0 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
18eb0 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
18ec0 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
18ed0 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
18ee0 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
18ef0 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
18f00 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
18f10 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
18f20 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
18f30 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
18f40 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
18f50 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
18f60 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
18f70 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
18f80 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
18f90 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
18fa0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
18fb0 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
18fc0 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
18fd0 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
18fe0 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
18ff0 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
19000 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
19010 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
19020 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
19030 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
19040 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
19050 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
19060 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
19070 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
19080 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
19090 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
190a0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
190b0 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
190c0 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
190d0 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
190e0 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
190f0 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
19100 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
19110 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
19120 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
19130 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
19140 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
19150 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
19160 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
19170 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
19180 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
19190 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
191a0 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
191b0 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
191c0 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
191d0 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
191e0 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
191f0 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
19200 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
19210 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
19220 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
19230 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
19240 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
19250 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
19260 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
19270 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
19280 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
19290 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
192a0 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
192b0 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
192c0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
192d0 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
192e0 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
192f0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
19300 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
19310 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
19320 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
19330 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
19340 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
19350 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
19360 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
19370 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68  ft in buf[].  Th
19380 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
19390 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61  onsible.** for a
193a0 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68  llocating enough
193b0 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20   space to buf[] 
193c0 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
193d0 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73  re field, exclus
193e0 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d  ive.** of the pM
193f0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65  em->u.nZero byte
19400 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f  s for a MEM_Zero
19410 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   value..**.** Re
19420 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
19430 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
19440 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
19450 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
19460 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
19470 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
19480 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
19490 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
194a0 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
194b0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
194c0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
194d0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
194e0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
194f0 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d  u8 *buf, Mem *pM
19500 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74  em, u32 serial_t
19510 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b  ype){.  u32 len;
19520 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
19530 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
19540 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
19550 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
19560 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
19570 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
19580 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
19590 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
195a0 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
195b0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29  eof(pMem->u.r) )
195c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
195d0 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73  v, &pMem->u.r, s
195e0 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
195f0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
19600 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
19610 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
19620 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
19630 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
19640 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
19650 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
19660 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
19670 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 );.    do{.   
19680 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75     buf[--i] = (u
19690 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
196a0 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
196b0 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20  while( i );.    
196c0 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
196d0 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
196e0 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
196f0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
19700 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
19710 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
19720 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
19730 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
19740 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
19750 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
19760 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
19770 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
19780 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
19790 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30  n;.    if( len>0
197a0 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70   ) memcpy(buf, p
197b0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
197c0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
197d0 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
197e0 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
197f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
19800 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20  }../* Input "x" 
19810 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  is a sequence of
19820 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63   unsigned charac
19830 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73  ters that repres
19840 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64  ent a.** big-end
19850 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65  ian integer.  Re
19860 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c  turn the equival
19870 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67  ent native integ
19880 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e  er.*/.#define ON
19890 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  E_BYTE_INT(x)   
198a0 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64   ((i8)(x)[0]).#d
198b0 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49  efine TWO_BYTE_I
198c0 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69  NT(x)    (256*(i
198d0 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31  8)((x)[0])|(x)[1
198e0 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45  ]).#define THREE
198f0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36  _BYTE_INT(x)  (6
19900 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  5536*(i8)((x)[0]
19910 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78  )|((x)[1]<<8)|(x
19920 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[2]).#define FO
19930 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20  UR_BYTE_UINT(x) 
19940 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c   (((u32)(x)[0]<<
19950 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  24)|((x)[1]<<16)
19960 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
19970 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [3]).#define FOU
19980 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31  R_BYTE_INT(x) (1
19990 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29  6777216*(i8)((x)
199a0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  [0])|((x)[1]<<16
199b0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
199c0 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
199d0 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
199e0 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
199f0 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
19a00 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
19a10 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
19a20 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
19a30 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
19a40 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19a50 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
19a60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  s function is im
19a70 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f  plemented as two
19a80 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
19a90 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  es for performan
19aa0 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63  ce..** The few c
19ab0 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72  ases that requir
19ac0 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
19ad0 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74  s are broken out
19ae0 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65   into a separate
19af0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  .** routine so t
19b00 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  hat in most case
19b10 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  s the overhead o
19b20 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61  f moving the sta
19b30 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73  ck pointer.** is
19b40 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74   avoided..*/ .st
19b50 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f  atic u32 SQLITE_
19b60 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47  NOINLINE serialG
19b70 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
19b80 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
19b90 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
19ba0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
19bb0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
19bc0 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
19bd0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
19be0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
19bf0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
19c00 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
19c10 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
19c20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
19c30 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
19c40 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
19c50 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
19c60 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54  u32 y = FOUR_BYT
19c70 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20  E_UINT(buf+4);. 
19c80 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
19c90 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
19ca0 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a  ype==6 ){.    /*
19cb0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19cc0 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75  29851-52272 Valu
19cd0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19ce0 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  n 64-bit.    ** 
19cf0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
19d00 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
19d10 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
19d20 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d  4*)&x;.    pMem-
19d30 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19d40 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
19d50 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
19d70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
19d80 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20  343-49114 Value 
19d90 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19da0 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34  IEEE 754-2008 64
19db0 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61  -bit.    ** floa
19dc0 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
19dd0 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  r. */.#if !defin
19de0 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
19df0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
19e00 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
19e10 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  T).    /* Verify
19e20 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
19e30 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
19e40 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
19e50 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74   same.    ** byt
19e60 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
19e70 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
19e80 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
19e90 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20  FLOAT is.    ** 
19ea0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
19eb0 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
19ec0 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
19ed0 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a   are mixed.    *
19ee0 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f  * endian..    */
19ef0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
19f00 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
19f10 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
19f20 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
19f30 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
19f40 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d  .0;.    u64 t2 =
19f50 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78   t1;.    swapMix
19f60 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
19f70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
19f80 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
19f90 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
19fa0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
19fb0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
19fc0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  if.    assert( s
19fd0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
19fe0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
19ff0 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d  ==8 );.    swapM
1a000 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1a010 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
1a020 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73  pMem->u.r, &x, s
1a030 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70  izeof(x));.    p
1a040 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
1a050 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
1a060 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  u.r) ? MEM_Null 
1a070 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a  : MEM_Real;.  }.
1a080 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33    return 8;.}.u3
1a090 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
1a0a0 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
1a0b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
1a0c0 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
1a0d0 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
1a0e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
1a0f0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
1a100 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
1a110 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
1a120 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
1a130 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
1a140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
1a150 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
1a160 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
1a170 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
1a180 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1a190 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
1a1a0 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
1a1b0 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
1a1c0 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
1a1d0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
1a1e0 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
1a1f0 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a  : {  /* Null */.
1a200 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a210 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39  E-OF: R-24078-09
1a220 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e  375 Value is a N
1a230 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ULL. */.      pM
1a240 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a250 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
1a260 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a270 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  e 1: {.      /* 
1a280 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
1a290 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65  4885-25196 Value
1a2a0 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f   is an 8-bit two
1a2b0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20  s-complement.   
1a2c0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a     ** integer. *
1a2d0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1a2e0 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  i = ONE_BYTE_INT
1a2f0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1a300 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a310 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1a320 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1a330 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a340 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
1a350 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
1a360 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1a370 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a380 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34  ENCE-OF: R-49794
1a390 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20  -35026 Value is 
1a3a0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d  a big-endian 16-
1a3b0 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
1a3c0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1a3d0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1a3e0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42  Mem->u.i = TWO_B
1a3f0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a400 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a410 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a420 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a430 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a440 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
1a450 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
1a460 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
1a470 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1a480 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a490 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61  R-37839-54301 Va
1a4a0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a4b0 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20  ian 24-bit.     
1a4c0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1a4d0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1a4e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a4f0 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
1a500 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1a510 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a520 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1a530 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1a540 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a550 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
1a560 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
1a570 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1a580 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a590 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39  ENCE-OF: R-01849
1a5a0 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20  -26079 Value is 
1a5b0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d  a big-endian 32-
1a5c0 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
1a5d0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1a5e0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1a5f0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
1a600 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23  BYTE_INT(buf);.#
1a610 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20  ifdef __HP_cc . 
1a620 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f       /* Work aro
1a630 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e  und a sign-exten
1a640 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20  sion bug in the 
1a650 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20  HP compiler for 
1a660 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69  HP/UX */.      i
1a670 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29  f( buf[0]&0x80 )
1a680 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78   pMem->u.i |= 0x
1a690 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30 30  ffffffff80000000
1a6a0 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  LL;.#endif.     
1a6b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1a6c0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1a6d0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1a6e0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1a6f0 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
1a700 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
1a710 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1a720 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
1a730 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
1a740 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65  0385-09674 Value
1a750 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1a760 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   48-bit.      **
1a770 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1a780 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1a790 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46     pMem->u.i = F
1a7a0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
1a7b0 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  f+2) + (((i64)1)
1a7c0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1a7d0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1a7e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a7f0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1a800 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1a810 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a820 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
1a830 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
1a840 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1a850 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
1a860 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
1a870 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
1a880 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20     /* These use 
1a890 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c  local variables,
1a8a0 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61   so do them in a
1a8b0 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
1a8c0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76  e.      ** to av
1a8d0 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f  oid having to mo
1a8e0 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69  ve the frame poi
1a8f0 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d  nter in the comm
1a900 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  on case */.     
1a910 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65   return serialGe
1a920 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70  t(buf,serial_typ
1a930 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e,pMem);.    }. 
1a940 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
1a950 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
1a960 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
1a970 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
1a980 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a990 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33  F: R-12976-22893
1a9a0 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
1a9b0 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20  teger 0. */.    
1a9c0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a9d0 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20  : R-18143-12121 
1a9e0 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74  Value is the int
1a9f0 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20  eger 1. */.     
1aa00 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72   pMem->u.i = ser
1aa10 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20  ial_type-8;.    
1aa20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1aa30 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
1aa40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1aa50 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1aa60 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1aa70 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36  OF: R-14606-3156
1aa80 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f  4 Value is a BLO
1aa90 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29  B that is (N-12)
1aaa0 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20  /2 bytes in.    
1aab0 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20    ** length..   
1aac0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
1aad0 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30  F: R-28401-00140
1aae0 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   Value is a stri
1aaf0 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20 65  ng in the text e
1ab00 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20  ncoding and.    
1ab10 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79    ** (N-13)/2 by
1ab20 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a  tes in length. *
1ab30 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
1ab40 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d  onst u16 aFlag[]
1ab50 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45   = { MEM_Blob|ME
1ab60 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72  M_Ephem, MEM_Str
1ab70 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20  |MEM_Ephem };.  
1ab80 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
1ab90 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20  har *)buf;.     
1aba0 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69   pMem->n = (seri
1abb0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
1abc0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1abd0 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f   = aFlag[serial_
1abe0 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72  type&1];.      r
1abf0 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  eturn pMem->n;. 
1ac00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ac10 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69  n 0;.}./*.** Thi
1ac20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1ac30 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75  d to allocate su
1ac40 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66  fficient space f
1ac50 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65  or an UnpackedRe
1ac60 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
1ac70 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  e large enough t
1ac80 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73  o be used with s
1ac90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1aca0 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74  Unpack() if.** t
1acb0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1acc0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
1acd0 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  o KeyInfo struct
1ace0 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a  ure pKeyInfo..**
1acf0 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73  .** The space is
1ad00 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65   either allocate
1ad10 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
1ad20 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20  bMallocRaw() or 
1ad30 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74  from within.** t
1ad40 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66  he unaligned buf
1ad50 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74  fer passed via t
1ad60 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68  he second and th
1ad70 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70  ird arguments (p
1ad80 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61  resumably.** sta
1ad90 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68  ck space). If th
1ada0 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a  e former, then *
1adb0 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
1adc0 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20   a pointer that 
1add0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65  should.** be eve
1ade0 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79  ntually freed by
1adf0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
1ae00 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
1ae10 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a  ). Or, if the .*
1ae20 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d  * allocation com
1ae30 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61  es from the pSpa
1ae40 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65  ce/szSpace buffe
1ae50 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  r, *ppFree is se
1ae60 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66  t to NULL.** bef
1ae70 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1ae80 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
1ae90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
1aea0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
1aeb0 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  /.UnpackedRecord
1aec0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c   *sqlite3VdbeAll
1aed0 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
1aee0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
1aef0 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 20  yInfo           
1af00 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
1af10 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  on of the record
1af20 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
1af30 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
1af40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
1af50 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
1af60 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
1af70 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
1af80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1af90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1afa0 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f  quired for *p */
1afb0 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
1afc0 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1afd0 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
1afe0 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
1aff0 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
1b000 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1b010 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
1b020 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
1b030 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
1b040 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1b050 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   0;.  p->aMem = 
1b060 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
1b070 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
1b080 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1b090 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
1b0a0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1b0b0 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
1b0c0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1b0d0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1b0e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b0f0 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
1b100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1b110 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
1b120 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
1b130 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
1b140 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
1b150 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
1b160 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
1b170 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
1b180 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
1b190 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1b1a0 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
1b1b0 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
1b1c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b1d0 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
1b1e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1b1f0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1b200 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
1b210 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
1b220 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
1b230 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b240 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1b250 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1b260 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
1b270 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
1b280 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1b290 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
1b2a0 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
1b2b0 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
1b2c0 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
1b2d0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1b2e0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1b2f0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b300 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e  har *)pKey;.  in
1b310 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  t d; .  u32 idx;
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1b340 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
1b350 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
1b360 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b380 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1b390 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
1b3a0 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
1b3b0 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
1b3c0 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
1b3d0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
1b3e0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1b3f0 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
1b400 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1b410 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1b420 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
1b430 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
1b440 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65  <szHdr && d<=nKe
1b450 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
1b460 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
1b470 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1b480 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
1b490 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1b4a0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
1b4b0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
1b4c0 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
1b4d0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
1b4e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
1b4f0 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
1b500 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
1b510 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
1b520 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61  /.    pMem->szMa
1b530 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d  lloc = 0;.    pM
1b540 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64  em->z = 0;.    d
1b550 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1b560 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
1b570 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1b580 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
1b590 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29  +;.    if( (++u)
1b5a0 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72  >=p->nField ) br
1b5b0 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  eak;.  }.  asser
1b5c0 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
1b5d0 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  nField + 1 );.  
1b5e0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d  p->nField = u;.}
1b5f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1b600 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
1b610 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1b620 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
1b630 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
1b640 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
1b650 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
1b660 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1b670 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
1b680 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
1b690 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
1b6a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1b6b0 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
1b6c0 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
1b6d0 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
1b6e0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b6f0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
1b700 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
1b710 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
1b720 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
1b730 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
1b740 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
1b750 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
1b760 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
1b770 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
1b780 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
1b790 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
1b7a0 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  itives..**.** Re
1b7b0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1b7c0 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1b7d0 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  rison is equival
1b7e0 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65  ent to desiredRe
1b7f0 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  sult..** Return 
1b800 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
1b810 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74  s a disagreement
1b820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b830 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b840 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
1b850 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1b860 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1b870 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
1b880 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1b890 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20  PKey2, /* Right 
1b8a0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  key */.  int des
1b8b0 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20  iredResult      
1b8c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63         /* Correc
1b8d0 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20  t answer */.){. 
1b8e0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1b8f0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1b900 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1b910 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1b920 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1b930 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b940 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1b950 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
1b960 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
1b970 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
1b980 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1b990 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1b9a0 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
1b9b0 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
1b9c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1b9d0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1b9e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1b9f0 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
1ba00 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
1ba10 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
1ba20 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1ba30 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  nfo;.  if( pKeyI
1ba40 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  nfo->db==0 ) ret
1ba50 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e  urn 1;.  mem1.en
1ba60 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1ba70 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
1ba80 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
1ba90 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
1baa0 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
1bab0 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
1bac0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1bad0 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
1bae0 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1baf0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1bb00 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1bb10 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1bb20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
1bb30 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
1bb40 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
1bb50 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
1bb60 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
1bb70 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
1bb80 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
1bb90 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
1bba0 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
1bbb0 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
1bbc0 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
1bbd0 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
1bbe0 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
1bbf0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
1bc00 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
1bc10 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
1bc20 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
1bc30 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
1bc40 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
1bc50 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
1bc60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1bc70 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
1bc80 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
1bc90 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
1bca0 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
1bcb0 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
1bcc0 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
1bcd0 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
1bce0 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
1bcf0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
1bd00 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
1bd10 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
1bd20 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
1bd30 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
1bd40 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1bd50 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73  szHdr1);.  if( s
1bd60 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65  zHdr1>98307 ) re
1bd70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1bd80 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  UPT;.  d1 = szHd
1bd90 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
1bda0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1bdb0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1bdc0 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1bdd0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1bde0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bdf0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1be00 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1be10 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1be20 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1be30 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1be40 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1be50 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1be60 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
1be70 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
1be80 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
1be90 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
1bea0 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
1beb0 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
1bec0 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
1bed0 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
1bee0 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
1bef0 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  y that there is 
1bf00 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65  enough key space
1bf10 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76   remaining to av
1bf20 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  oid.    ** a buf
1bf30 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54  fer overread.  T
1bf40 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79  he "d1+serial_ty
1bf50 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73  pe1+2" subexpres
1bf60 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  sion will.    **
1bf70 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74   always be great
1bf80 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1bf90 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   to the amount o
1bfa0 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73  f required key s
1bfb0 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65  pace..    ** Use
1bfc0 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74   that approximat
1bfd0 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65  ion to avoid the
1bfe0 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20   more expensive 
1bff0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
1c000 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1c010 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65  TypeLen() in the
1c020 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
1c030 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b    */.    if( d1+
1c040 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
1c050 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u32)nKey1.     &
1c060 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65  & d1+sqlite3Vdbe
1c070 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1c080 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32  rial_type1)>(u32
1c090 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
1c0a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c0b0 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
1c0c0 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
1c0d0 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
1c0e0 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
1c0f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1c100 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1c110 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
1c120 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
1c130 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
1c140 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1c150 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1c160 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
1c170 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e  >aMem[i], pKeyIn
1c180 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
1c190 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1c1a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1c1b0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1c1c0 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1c1d0 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1c1e0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1c1f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1c200 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1c210 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
1c220 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
1c230 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
1c240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1c250 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
1c260 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
1c270 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
1c280 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
1c290 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
1c2a0 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1c2b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1c2c0 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1c2d0 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1c2e0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1c2f0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1c300 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1c310 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1c320 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1c330 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1c340 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1c350 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1c360 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
1c370 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1c380 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1c390 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1c3a0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
1c3b0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1c3c0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1c3d0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1c3e0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1c3f0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1c400 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1c410 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1c420 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
1c430 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1c440 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
1c450 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
1c460 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
1c470 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1c480 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1c490 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
1c4a0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1c4b0 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
1c4c0 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
1c4d0 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
1c4e0 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
1c4f0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1c500 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c510 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
1c520 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1c530 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c540 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  DEBUG./*.** Coun
1c550 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1c560 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63  fields (a.k.a. c
1c570 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72  olumns) in the r
1c580 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a  ecord given by.*
1c590 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68  * pKey,nKey.  Th
1c5a0 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1c5b0 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73  is count is less
1c5c0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1c5d0 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67  o the.** limit g
1c5e0 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f  iven by pKeyInfo
1c5f0 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49  ->nField + pKeyI
1c600 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a  nfo->nXField..**
1c610 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73  .** If this cons
1c620 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61  traint is not sa
1c630 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e  tisfied, it mean
1c640 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d  s that the high-
1c650 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63  speed.** vdbeRec
1c660 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1c670 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f  and vdbeRecordCo
1c680 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f  mpareString() ro
1c690 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  utines will.** n
1c6a0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1c6b0 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65  y.  If this asse
1c6c0 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c  rt() ever fires,
1c6d0 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61   it probably mea
1c6e0 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b  ns.** that the K
1c6f0 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72  eyInfo.nField or
1c700 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
1c710 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d   values were com
1c720 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65  puted.** incorre
1c730 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
1c740 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46  void vdbeAssertF
1c750 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1c760 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65  imits(.  int nKe
1c770 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  y, const void *p
1c780 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65  Key,   /* The re
1c790 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a  cord to verify *
1c7a0 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  / .  const KeyIn
1c7b0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1c7c0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69     /* Compare si
1c7d0 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79  ze with this Key
1c7e0 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Info */.){.  int
1c7f0 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75   nField = 0;.  u
1c800 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20  32 szHdr;.  u32 
1c810 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73  idx;.  u32 notUs
1c820 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ed;.  const unsi
1c830 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1c840 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1c850 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20  d char*)pKey;.. 
1c860 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1c870 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20  ) return;.  idx 
1c880 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1c890 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73  ey, szHdr);.  as
1c8a0 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b  sert( nKey>=0 );
1c8b0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72  .  assert( szHdr
1c8c0 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20  <=(u32)nKey );. 
1c8d0 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
1c8e0 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20  r ){.    idx += 
1c8f0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c900 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a  +idx, notUsed);.
1c910 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20      nField++;.  
1c920 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  }.  assert( nFie
1c930 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld <= pKeyInfo->
1c940 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
1c950 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  >nXField );.}.#e
1c960 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1c970 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1c980 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1c990 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1c9a0 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1c9b0 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1c9c0 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1c9d0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1c9e0 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1c9f0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1ca00 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1ca10 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1ca20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1ca30 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1ca40 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1ca50 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1ca60 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1ca70 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1ca80 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1ca90 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1caa0 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1cab0 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1cac0 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1cad0 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1cae0 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1caf0 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1cb00 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1cb10 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1cb20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1cb30 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1cb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1cb50 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1cb60 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1cb70 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1cb80 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1cb90 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1cba0 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1cbb0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1cbc0 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1cbd0 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1cbe0 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1cbf0 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1cc00 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1cc10 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1cc20 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1cc30 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1cc40 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1cc50 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1cc60 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1cc70 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69   *v1, *v2;.    i
1cc80 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d  nt n1, n2;.    M
1cc90 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1cca0 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1ccb0 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1ccc0 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1ccd0 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1cce0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1ccf0 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1cd00 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1cd10 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1cd20 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1cd30 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1cd40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1cd50 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1cd60 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1cd70 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1cd80 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1cd90 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1cda0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1cdb0 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20     n1 = v1==0 ? 
1cdc0 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32  0 : c1.n;.    v2
1cdd0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1cde0 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1cdf0 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1ce00 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76  enc);.    n2 = v
1ce10 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b  2==0 ? 0 : c2.n;
1ce20 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d  .    rc = pColl-
1ce30 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1ce40 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20  er, n1, v1, n2, 
1ce50 76 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  v2);.    if( (v1
1ce60 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26  ==0 || v2==0) &&
1ce70 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1ce80 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1ce90 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74  _BKPT;.    sqlit
1cea0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1ceb0 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&c1);.    sqlit
1cec0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1ced0 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72  (&c2);.    retur
1cee0 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
1cef0 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c  ** The input pBl
1cf00 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ob is guaranteed
1cf10 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68   to be a Blob th
1cf20 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64  at is not marked
1cf30 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72  .** with MEM_Zer
1cf40 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  o.  Return true 
1cf50 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61  if it could be a
1cf60 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73   zero-blob..*/.s
1cf70 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a  tatic int isAllZ
1cf80 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ero(const char *
1cf90 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
1cfa0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1cfb0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
1cfc0 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( z[i] ) return 
1cfd0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1cfe0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
1cff0 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20  are two blobs.  
1d000 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1d010 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1d020 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  ve if the first.
1d030 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ** is less than,
1d040 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1d050 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
1d060 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76  econd, respectiv
1d070 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62  ely..** If one b
1d080 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20  lob is a prefix 
1d090 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68  of the other, th
1d0a0 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69  en the shorter i
1d0b0 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f  s the lessor..*/
1d0c0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
1d0d0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69  OINLINE int sqli
1d0e0 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63  te3BlobCompare(c
1d0f0 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63  onst Mem *pB1, c
1d100 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a  onst Mem *pB2){.
1d110 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e    int c;.  int n
1d120 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e  1 = pB1->n;.  in
1d130 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a  t n2 = pB2->n;..
1d140 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
1d150 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c  ble to have a Bl
1d160 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  ob value that ha
1d170 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20  s some non-zero 
1d180 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c  content.  ** fol
1d190 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f  lowed by zero co
1d1a0 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74  ntent.  But that
1d1b0 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66   only comes up f
1d1c0 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a  or Blobs formed.
1d1d0 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d    ** by the OP_M
1d1e0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1d1f0 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73  , and such Blobs
1d200 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65   never get passe
1d210 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  d into.  ** sqli
1d220 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e  te3MemCompare().
1d230 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
1d240 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1d250 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d  Zero)==0 || n1==
1d260 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1d270 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB2->flags & MEM
1d280 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d  _Zero)==0 || n2=
1d290 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42  =0 );..  if( (pB
1d2a0 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c  1->flags|pB2->fl
1d2b0 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  ags) & MEM_Zero 
1d2c0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e  ){.    if( pB1->
1d2d0 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61  flags & pB2->fla
1d2e0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1d2f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1d300 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32  1->u.nZero - pB2
1d310 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d  ->u.nZero;.    }
1d320 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c  else if( pB1->fl
1d330 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1d340 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1d350 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70  llZero(pB2->z, p
1d360 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B2->n) ) return 
1d370 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d380 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1d390 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n2;.    }else{. 
1d3a0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1d3b0 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d  ero(pB1->z, pB1-
1d3c0 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  >n) ) return +1;
1d3d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31  .      return n1
1d3e0 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1d3f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d  .    }.  }.  c =
1d400 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1d410 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20  pB2->z, n1>n2 ? 
1d420 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20  n2 : n1);.  if( 
1d430 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1d440 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a  return n1 - n2;.
1d450 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
1d460 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
1d470 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
1d480 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36   integer and a 6
1d490 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70  4-bit floating-p
1d4a0 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20  oint.** number. 
1d4b0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1d4c0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1d4d0 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1d4e0 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74   (i64) is less t
1d4f0 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  han,.** equal to
1d500 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1d510 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f  n the second (do
1d520 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  uble)..*/.static
1d530 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46   int sqlite3IntF
1d540 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20  loatCompare(i64 
1d550 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  i, double r){.  
1d560 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  if( sizeof(LONGD
1d570 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b  OUBLE_TYPE)>8 ){
1d580 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
1d590 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f  TYPE x = (LONGDO
1d5a0 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20  UBLE_TYPE)i;.   
1d5b0 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72   if( x<r ) retur
1d5c0 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e  n -1;.    if( x>
1d5d0 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1d5e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d5f0 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b  else{.    i64 y;
1d600 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20  .    double s;. 
1d610 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37     if( r<-922337
1d620 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1d630 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1d640 20 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33   if( r>922337203
1d650 36 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72  6854775807.0 ) r
1d660 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20  eturn -1;.    y 
1d670 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66  = (i64)r;.    if
1d680 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d  ( i<y ) return -
1d690 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29  1;.    if( i>y )
1d6a0 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53  {.      if( y==S
1d6b0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26  MALLEST_INT64 &&
1d6c0 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20   r>0.0 ) return 
1d6d0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d6e0 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   +1;.    }.    s
1d6f0 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20   = (double)i;.  
1d700 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75    if( s<r ) retu
1d710 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73  rn -1;.    if( s
1d720 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1d730 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d740 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1d750 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f  re the values co
1d760 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74  ntained by the t
1d770 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c  wo memory cells,
1d780 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65   returning.** ne
1d790 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20  gative, zero or 
1d7a0 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d  positive if pMem
1d7b0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1d7c0 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1d7d0 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65  ater.** than pMe
1d7e0 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65  m2. Sorting orde
1d7f0 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73  r is NULL's firs
1d800 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e  t, followed by n
1d810 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73  umbers (integers
1d820 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73  .** and reals) s
1d830 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c  orted numericall
1d840 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  y, followed by t
1d850 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74  ext ordered by t
1d860 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
1d870 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61  sequence pColl a
1d880 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  nd finally blob'
1d890 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
1d8a0 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
1d8b0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1d8c0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
1d8d0 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
1d8e0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1d8f0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e  e3MemCompare(con
1d900 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63  st Mem *pMem1, c
1d910 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1d920 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1d930 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31  pColl){.  int f1
1d940 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
1d950 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
1d960 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
1d970 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
1d980 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
1d990 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
1d9a0 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62  .  assert( (comb
1d9b0 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
1d9c0 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
1d9d0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1d9e0 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
1d9f0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
1da00 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
1da10 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
1da20 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
1da30 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1da40 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
1da50 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
1da60 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
1da70 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
1da80 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73   }..  /* At leas
1da90 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  t one of the two
1daa0 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d   values is a num
1dab0 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ber.  */.  if( c
1dac0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1dad0 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1dae0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1daf0 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
1db00 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1db10 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
1db20 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1db30 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1db40 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
1db50 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1db60 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1db70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1db80 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1db90 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1dba0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1dbb0 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r < pMem2->u.r )
1dbc0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1dbd0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1dbe0 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   > pMem2->u.r ) 
1dbf0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1dc00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1dc10 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1dc20 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1dc30 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1dc40 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1dc50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1dc60 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1dc70 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem1->u.i, pMem
1dc80 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  2->u.r);.      }
1dc90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1dca0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1dcb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1dcc0 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
1dcd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1dce0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1dcf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1dd00 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1dd10 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e  ompare(pMem2->u.
1dd20 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a  i, pMem1->u.r);.
1dd30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dd40 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1dd50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1dd60 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d    return +1;.  }
1dd70 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1dd80 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1dd90 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1dda0 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
1ddb0 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
1ddc0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
1ddd0 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
1dde0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1ddf0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
1de00 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1de10 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
1de20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1de30 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1de40 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1de50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1de60 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
1de70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1de80 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
1de90 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1dea0 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c  c==pMem2->enc ||
1deb0 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c   pMem1->db->mall
1dec0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1ded0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1dee0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1def0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1df00 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1df10 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1df20 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1df30 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1df40 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1df50 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1df60 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1df70 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1df80 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1df90 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1dfa0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1dfb0 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1dfc0 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1dfd0 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1dfe0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1dff0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1e000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1e010 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1e020 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1e030 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1e040 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1e050 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1e060 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1e070 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1e080 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1e090 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1e0a0 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1e0b0 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1e0c0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1e0d0 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1e0e0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1e0f0 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1e100 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1e110 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1e120 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1e130 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1e140 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1e150 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1e160 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1e170 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1e180 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1e190 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1e1a0 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1e1b0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1e1c0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1e1d0 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1e1e0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1e1f0 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1e200 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1e210 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1e220 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1e230 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1e240 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1e250 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1e260 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1e270 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1e280 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1e290 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1e2a0 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1e2b0 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1e2c0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1e2d0 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1e2e0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1e2f0 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1e300 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1e310 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1e320 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1e330 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1e340 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1e350 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1e360 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e370 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e380 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1e390 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1e3a0 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1e3b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e3c0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e3d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1e3e0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1e3f0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1e400 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e410 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e420 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_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 34 3a 20 7b 0a 20 20 20     case 4: {.   
1e450 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e460 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e470 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1e480 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1e490 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1e4a0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1e4b0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1e4c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e4d0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e4e0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1e4f0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1e500 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1e510 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1e520 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1e530 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1e540 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1e550 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1e560 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e570 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e580 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1e590 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1e5a0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1e5b0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1e5c0 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1e5d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1e5e0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1e5f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e600 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1e610 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1e620 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1e630 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1e640 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1e650 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1e660 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1e670 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1e680 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1e690 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1e6a0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1e6b0 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1e6c0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1e6d0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1e6e0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1e6f0 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1e700 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1e710 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1e720 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1e730 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1e740 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1e750 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1e760 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1e770 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1e780 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1e790 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1e7a0 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1e7b0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1e7c0 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1e7d0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1e7e0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1e7f0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1e800 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1e810 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1e820 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1e830 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1e840 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1e850 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1e860 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1e870 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1e880 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1e890 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1e8a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1e8b0 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1e8c0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1e8d0 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1e8e0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1e8f0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1e900 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1e910 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1e920 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1e930 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1e940 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1e950 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1e960 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1e970 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1e980 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1e990 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1e9a0 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1e9b0 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1e9c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1e9d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1e9e0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1e9f0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1ea00 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1ea10 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1ea20 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1ea30 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1ea40 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1ea50 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ea70 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1ea80 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1ea90 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1eac0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1ead0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1eae0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1eb10 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1eb20 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1eb30 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1eb50 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1eb60 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1eb70 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1eba0 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1ebb0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1ebc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1ebd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ebe0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1ebf0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1ec00 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1ec10 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1ec20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1ec30 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1ec40 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1ec50 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1ec60 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ec70 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1ec80 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ec90 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1eca0 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1ecb0 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1ecc0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1ecd0 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1ece0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1ecf0 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1ed00 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1ed10 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1ed20 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1ed30 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1ed40 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1ed50 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1ed60 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1ed70 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1ed80 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1ed90 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1eda0 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1edb0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1edc0 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1edd0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1ede0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1edf0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1ee00 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1ee10 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1ee20 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1ee30 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1ee40 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1ee50 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1ee60 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1ee70 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1ee80 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1ee90 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1eea0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1eeb0 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1eec0 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1eed0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1eee0 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1eef0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1ef00 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1ef10 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1ef20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1ef30 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1ef40 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1ef50 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1ef60 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1ef70 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1ef80 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1ef90 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1efa0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1efb0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1efc0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1efd0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1efe0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1eff0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1f000 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1f010 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1f020 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1f030 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1f040 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1f050 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1f060 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1f070 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1f080 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1f090 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1f0a0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1f0b0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1f0c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1f0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f0e0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1f0f0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1f110 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1f120 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1f130 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1f140 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1f150 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1f160 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1f170 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1f180 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74  rc = -sqlite3Int
1f190 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68  FloatCompare(pRh
1f1a0 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72  s->u.i, mem1.u.r
1f1b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f1c0 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1f1d0 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1f1e0 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1f1f0 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1f200 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1f210 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1f220 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1f230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f240 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1f250 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1f260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f270 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1f280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f290 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1f2a0 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1f2b0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1f2c0 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1f2d0 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1f2e0 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1f2f0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f300 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1f310 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1f320 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72  es 12 or greater
1f330 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64   are strings and
1f340 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20   blobs (greater 
1f350 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  than.        ** 
1f360 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20  numbers). Types 
1f370 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75  10 and 11 are cu
1f380 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65  rrently "reserve
1f390 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20  d for future .  
1f3a0 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73        ** use", s
1f3b0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61  o it doesn't rea
1f3c0 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20  lly matter what 
1f3d0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
1f3e0 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20  omparing.       
1f3f0 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62   ** them to numb
1f400 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e  eric values are.
1f410 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1f420 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1f430 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1f440 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1f450 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1f460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1f470 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1f480 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1f490 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1f4a0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1f4b0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1f4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1f4d0 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75  mem1.u.r<pRhs->u
1f4e0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1f4f0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1f510 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e  em1.u.r>pRhs->u.
1f520 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1f530 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1f540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1f550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1f560 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  c = sqlite3IntFl
1f570 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e  oatCompare(mem1.
1f580 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b  u.i, pRhs->u.r);
1f590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f5a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f5b0 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
1f5c0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1f5d0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1f5e0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
1f5f0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1f600 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1f610 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1f620 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1f630 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1f640 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f650 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
1f660 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1f670 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1f680 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1f690 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1f6a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f6b0 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
1f6c0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1f6d0 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1f6e0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1f6f0 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
1f700 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1f710 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1f720 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
1f730 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1f740 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
1f750 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
1f760 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1f770 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1f780 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1f790 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f7a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f7b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f7c0 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1f7d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1f7e0 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
1f7f0 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
1f800 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
1f810 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1f820 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
1f830 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1f840 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1f850 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
1f860 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1f870 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
1f880 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
1f890 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
1f8a0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20  reMemString(.   
1f8b0 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31             &mem1
1f8c0 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f  , pRhs, pKeyInfo
1f8d0 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b  ->aColl[i], &pPK
1f8e0 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ey2->errCode.   
1f8f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1f900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f910 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1f920 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e  N(mem1.n, pRhs->
1f930 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1f940 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1f950 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1f960 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1f970 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1f980 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e   mem1.n - pRhs->
1f990 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n; .        }.  
1f9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f9b0 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f   /* RHS is a blo
1f9c0 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  b */.    else if
1f9d0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1f9e0 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
1f9f0 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73 2d    assert( (pRhs-
1fa00 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1fa10 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e  o)==0 || pRhs->n
1fa20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74  ==0 );.      get
1fa30 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1fa40 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1fa50 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1fa60 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1fa70 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1fa80 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1fa90 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1faa0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1fab0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1fac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fad0 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65    int nStr = (se
1fae0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1faf0 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1fb00 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29  tcase( (d1+nStr)
1fb10 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1fb20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1fb30 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b  tcase( (d1+nStr+
1fb40 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1fb50 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1fb60 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28  f( (d1+nStr) > (
1fb70 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1fb80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1fb90 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1fba0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1fbb0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1fbc0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1fbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1fbe0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1fbf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68     }else if( pRh
1fc00 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  s->flags & MEM_Z
1fc10 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ero ){.         
1fc20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
1fc30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b  (const char*)&aK
1fc40 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b  ey1[d1],nStr) ){
1fc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fc60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
1fc70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fc80 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52    rc = nStr - pR
1fc90 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  hs->u.nZero;.   
1fca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fcb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fcc0 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1fcd0 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b  (nStr, pRhs->n);
1fce0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fcf0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1fd00 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1fd10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1fd20 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53   rc==0 ) rc = nS
1fd30 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20  tr - pRhs->n;.  
1fd40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1fd50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1fd60 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  S is null */.   
1fd70 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72   else{.      ser
1fd80 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1fd90 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63  [idx1];.      rc
1fda0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21   = (serial_type!
1fdb0 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =0);.    }..    
1fdc0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1fdd0 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1fde0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1fdf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1fe00 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1fe10 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1fe20 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1fe30 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1fe40 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20  PKey2, rc) );.  
1fe50 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1fe60 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1fe70 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1fe80 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  below */.      r
1fe90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fea0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52  .    i++;.    pR
1feb0 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20  hs++;.    d1 += 
1fec0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1fed0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1fee0 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20  type);.    idx1 
1fef0 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74  += sqlite3Varint
1ff00 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1ff10 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1ff20 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72  <(unsigned)szHdr
1ff30 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1ff40 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e  Field && d1<=(un
1ff50 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1ff60 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1ff70 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1ff80 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1ff90 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1ffa0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1ffb0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1ffc0 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1ffd0 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1ffe0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1fff0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
20000 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
20010 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
20020 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61  (&mem1).  */.  a
20030 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
20040 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
20050 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
20060 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f  s that one or bo
20070 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  th of the keys r
20080 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
20090 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
200a0 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
200b0 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
200c0 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
200d0 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
200e0 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73   value.  */.  as
200f0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
20100 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65   .       || vdbe
20110 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
20120 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
20130 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d   pPKey2, pPKey2-
20140 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20  >default_rc) .  
20150 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f       || pKeyInfo
20160 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
20170 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32  ed.  );.  pPKey2
20180 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
20190 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
201a0 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74  efault_rc;.}.int
201b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
201c0 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
201d0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
201e0 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
201f0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
20200 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
20210 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a  Key2          /*
20220 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
20230 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20240 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20250 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
20260 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
20270 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
20280 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20290 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
202a0 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
202b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
202c0 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
202d0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
202e0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
202f0 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
20300 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
20310 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
20320 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
20330 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
20340 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
20350 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
20360 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
20370 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
20380 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
20390 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
203a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
203b0 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
203c0 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
203d0 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
203e0 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
203f0 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
20400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
20410 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
20420 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
20430 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
20440 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
20450 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
20460 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
20470 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
20480 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
20490 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
204a0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
204b0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
204c0 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
204d0 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
204e0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
204f0 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
20500 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
20510 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c    i64 v;.  i64 l
20520 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
20530 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
20540 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
20550 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
20560 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
20570 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
20580 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
20590 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
205a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
205b0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
205c0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
205d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
205e0 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
205f0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
20600 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
20610 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
20620 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20630 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
20640 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
20650 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
20660 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20680 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
20690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
206a0 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
206b0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
206c0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
206d0 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
206e0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
206f0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20700 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20710 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
20720 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
20730 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20740 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
20750 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
20760 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
20770 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
20780 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
20790 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
207a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
207b0 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
207c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
207d0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
207e0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
207f0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
20800 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
20810 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
20820 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20830 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20840 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
20850 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
20860 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20870 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
20880 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
20890 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
208a0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
208b0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
208c0 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
208d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
208e0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
208f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20900 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
20910 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
20920 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
20930 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
20940 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
20950 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
20960 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
20970 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
20980 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
20990 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
209a0 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
209b0 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
209c0 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
209d0 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
209e0 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
209f0 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
20a00 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
20a10 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
20a20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
20a30 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
20a40 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
20a50 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
20a60 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
20a70 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
20a80 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
20a90 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
20aa0 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
20ab0 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
20ac0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
20ad0 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
20ae0 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
20af0 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
20b00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
20b10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20b20 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20b30 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
20b40 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
20b50 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
20b60 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
20b70 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20b80 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50  );.  }..  v = pP
20b90 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e  Key2->aMem[0].u.
20ba0 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  i;.  if( v>lhs )
20bb0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
20bc0 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
20bd0 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
20be0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20bf0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
20c00 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
20c10 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
20c20 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
20c30 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
20c40 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
20c50 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
20c60 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
20c70 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
20c80 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20c90 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
20ca0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20cb0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
20cc0 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
20cd0 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
20ce0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
20cf0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
20d00 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
20d10 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
20d20 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
20d30 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
20d40 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
20d50 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
20d60 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
20d70 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
20d80 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
20d90 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20da0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20db0 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
20dc0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
20dd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20de0 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
20df0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
20e00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20e10 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
20e20 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
20e30 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
20e40 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
20e50 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
20e60 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
20e70 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
20e80 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
20e90 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
20ea0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
20eb0 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
20ec0 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
20ed0 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
20ee0 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
20ef0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
20f00 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
20f10 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
20f20 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
20f30 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
20f40 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20f50 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
20f60 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20f70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
20f80 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
20f90 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
20fa0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
20fb0 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
20fc0 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
20fd0 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
20fe0 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
20ff0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
21000 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
21010 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
21020 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
21030 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
21040 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
21050 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
21060 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
21070 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
21080 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
21090 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
210a0 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
210b0 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
210c0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
210d0 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
210e0 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
210f0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
21100 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
21110 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
21120 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
21130 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
21140 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
21150 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
21160 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
21170 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
21180 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
21190 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
211a0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
211b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
211c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
211d0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
211e0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
211f0 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
21200 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
21210 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
21220 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
21230 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
21240 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
21250 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
21260 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
21270 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
21280 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
21290 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
212a0 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
212b0 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
212c0 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
212d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
212e0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
212f0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21300 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
21310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21320 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
21330 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
21340 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
21350 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
21360 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
21370 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
21380 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21390 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
213a0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
213b0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
213c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
213d0 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
213e0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
213f0 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
21400 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
21410 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
21420 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
21430 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
21440 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
21450 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
21460 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
21470 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
21480 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
21490 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
214a0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
214b0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
214c0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
214d0 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
214e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
214f0 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
21500 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
21510 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
21520 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
21530 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
21540 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
21550 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
21560 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
21570 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
21580 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
21590 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
215a0 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
215b0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
215c0 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
215d0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
215e0 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
215f0 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
21600 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
21610 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
21620 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
21630 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
21640 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
21650 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
21660 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
21670 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
21680 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
21690 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
216a0 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
216b0 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
216c0 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
216d0 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
216e0 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
216f0 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
21700 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
21710 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
21720 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
21730 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
21740 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
21750 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
21760 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
21770 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
21780 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
21790 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
217a0 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
217b0 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
217c0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
217d0 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
217e0 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
217f0 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
21800 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
21810 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
21820 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
21830 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
21840 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
21850 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
21860 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
21870 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
21880 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
21890 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
218a0 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
218b0 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
218c0 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
218d0 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  tes.  */.  if( (
218e0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  p->pKeyInfo->nFi
218f0 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66  eld + p->pKeyInf
21900 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20  o->nXField)<=13 
21910 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
21920 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c   = p->aMem[0].fl
21930 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ags;.    if( p->
21940 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
21950 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rder[0] ){.     
21960 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20   p->r1 = 1;.    
21970 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20    p->r2 = -1;.  
21980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21990 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ->r1 = -1;.     
219a0 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20   p->r2 = 1;.    
219b0 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
219c0 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20   & MEM_Int) ){. 
219d0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
219e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
219f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
21a00 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
21a10 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65  M_Real );.    te
21a20 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
21a30 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  MEM_Null );.    
21a40 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
21a50 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
21a60 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
21a70 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c  MEM_Real|MEM_Nul
21a80 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  l|MEM_Blob))==0 
21a90 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  && p->pKeyInfo->
21aa0 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20  aColl[0]==0 ){. 
21ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
21ac0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
21ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
21ae0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
21af0 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ring;.    }.  }.
21b00 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21b10 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
21b20 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  re;.}../*.** pCu
21b30 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
21b40 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
21b50 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
21b60 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
21b70 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
21b80 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
21b90 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
21ba0 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
21bb0 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
21bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21bd0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
21be0 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
21bf0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
21c00 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
21c10 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
21c20 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
21c30 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
21c40 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
21c50 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
21c60 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
21c70 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
21c80 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
21c90 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
21ca0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
21cb0 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
21cc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
21cd0 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
21ce0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
21cf0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
21d00 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
21d10 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
21d20 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
21d30 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
21d40 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
21d50 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
21d60 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
21d70 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
21d80 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
21d90 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
21da0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
21db0 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
21dc0 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
21dd0 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
21de0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
21df0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
21e00 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
21e10 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
21e20 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
21e30 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
21e40 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
21e50 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
21e60 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
21e70 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
21e80 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
21e90 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
21ea0 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
21eb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
21ec0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
21ed0 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c  (pCur) );.  nCel
21ee0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  lKey = sqlite3Bt
21ef0 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
21f00 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Cur);.  assert( 
21f10 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
21f20 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
21f30 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
21f40 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
21f50 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
21f60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
21f70 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
21f80 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
21f90 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
21fa0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
21fb0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
21fc0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26  (u32)nCellKey, &
21fd0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
21fe0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21ff0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
22000 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
22010 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
22020 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
22030 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
22040 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
22050 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
22060 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
22070 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
22080 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
22090 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
220a0 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
220b0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
220c0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
220d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
220e0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
220f0 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
22100 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
22110 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
22120 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
22130 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
22140 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
22150 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
22160 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
22170 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
22180 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22190 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
221a0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
221b0 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
221c0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
221d0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
221e0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
221f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22200 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
22210 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22220 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
22230 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22240 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
22250 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
22260 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
22270 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
22280 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
22290 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
222a0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
222b0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
222c0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
222d0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
222e0 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64  eSizes[typeRowid
222f0 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ];.  testcase( (
22300 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
22310 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
22320 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
22330 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
22340 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
22350 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
22360 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
22370 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
22380 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
22390 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
223a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
223b0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
223c0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
223d0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
223e0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
223f0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
22400 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
22410 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22420 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
22430 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
22440 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
22450 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
22460 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
22470 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
22480 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
22490 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
224a0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
224b0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
224c0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
224d0 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
224e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
224f0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
22500 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22510 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
22520 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
22530 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
22540 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
22550 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
22560 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
22570 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
22580 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
22590 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
225a0 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
225b0 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
225c0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
225d0 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
225e0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
225f0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
22600 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
22610 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
22620 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
22630 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
22640 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
22650 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
22660 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
22670 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
22680 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
22690 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
226a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
226b0 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
226c0 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
226d0 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
226e0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
226f0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
22700 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
22710 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
22720 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
22730 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
22740 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22750 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
22760 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
22770 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22780 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
22790 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
227a0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
227b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
227c0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
227d0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
227e0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
227f0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
22800 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
22810 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
22820 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
22830 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
22840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22850 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
22860 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
22870 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
22880 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
22890 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
228a0 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  Cur;.  Mem m;.. 
228b0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
228c0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
228d0 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d  TREE );.  pCur =
228e0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
228f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22900 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
22910 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
22920 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  nCellKey = sqlit
22930 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
22940 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e  ze(pCur);.  /* n
22950 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
22960 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
22970 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
22980 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
22990 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
229a0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
229b0 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
229c0 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
229d0 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
229e0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
229f0 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
22a00 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
22a10 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
22a20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22a30 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
22a40 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
22a50 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
22a60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
22a70 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
22a80 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
22a90 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  y, &m);.  if( rc
22aa0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22ab0 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
22ac0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22ad0 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
22ae0 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
22af0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
22b00 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
22b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22b20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
22b30 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
22b40 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
22b50 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
22b60 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
22b70 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
22b80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22b90 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
22ba0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
22bb0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
22bc0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
22bd0 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
22be0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22bf0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
22c00 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
22c10 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
22c20 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
22c30 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
22c40 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
22c50 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
22c60 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
22c70 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
22c80 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
22c90 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
22ca0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
22cb0 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
22cc0 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
22cd0 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
22ce0 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
22cf0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
22d00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22d10 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
22d20 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
22d30 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
22d40 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
22d50 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
22d60 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
22d70 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
22d80 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
22d90 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
22da0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
22db0 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
22dc0 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
22dd0 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
22de0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
22df0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
22e00 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
22e10 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
22e20 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
22e30 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
22e40 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
22e50 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
22e60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
22e70 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
22e80 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
22e90 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
22ea0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
22eb0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
22ec0 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
22ed0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
22ee0 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
22ef0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
22f00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
22f10 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
22f20 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
22f30 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
22f40 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
22f50 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
22f60 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
22f70 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22f80 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
22f90 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
22fa0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
22fb0 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
22fc0 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
22fd0 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
22fe0 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
22ff0 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
23000 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
23010 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
23020 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
23030 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
23040 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
23050 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
23060 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
23070 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
23080 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
23090 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
230a0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
230b0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
230c0 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
230d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
230e0 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
230f0 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
23100 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
23110 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
23120 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
23130 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
23140 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
23150 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
23160 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
23170 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
23180 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
23190 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
231a0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
231b0 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
231c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
231d0 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
231e0 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
231f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23200 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
23210 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
23220 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
23230 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
23240 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
23250 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
23260 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
23270 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
23280 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
23290 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
232a0 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
232b0 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
232c0 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
232d0 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
232e0 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
232f0 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
23300 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
23310 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
23320 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
23330 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
23340 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
23350 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32  ;.  if( iVar>=32
23360 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
23370 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30  sk |= 0x80000000
23380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
23390 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75  ->expmask |= ((u
233a0 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29  32)1 << (iVar-1)
233b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
233c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
233d0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
233e0 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20   Transfer error 
233f0 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f  message text fro
23400 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  m an sqlite3_vta
23410 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  b.zErrMsg (text 
23420 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
23430 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
23440 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
23450 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45  ) into a Vdbe.zE
23460 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
23470 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
23480 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
23490 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a  lite3DbMalloc)..
234a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
234b0 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
234c0 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  Vdbe *p, sqlite3
234d0 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
234e0 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72   if( pVtab->zErr
234f0 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
23500 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
23510 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23520 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
23530 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
23540 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
23550 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
23560 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
23570 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
23580 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
23590 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
235a0 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  0;.  }.}.#endif 
235b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
235c0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
235d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
235e0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
235f0 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  OOK../*.** If th
23600 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23610 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72  t is not NULL, r
23620 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63  elease any alloc
23630 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ations associate
23640 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d  d .** with the m
23650 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74  emory cells in t
23660 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72  he p->aMem[] arr
23670 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68  ay. Also free th
23680 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e UnpackedRecord
23690 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74  .** structure it
236a0 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69  self, using sqli
236b0 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a  te3DbFree()..**.
236c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
236d0 20 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65   is used to free
236e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
236f0 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63  structures alloc
23700 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76  ated by.** the v
23710 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28  dbeUnpackRecord(
23720 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64  ) function found
23730 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a   in vdbeapi.c..*
23740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
23750 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73  beFreeUnpacked(s
23760 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
23770 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64  nField, Unpacked
23780 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66  Record *p){.  if
23790 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
237a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
237b0 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  <nField; i++){. 
237c0 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
237d0 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
237e0 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
237f0 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
23800 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
23810 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  em);.    }.    s
23820 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23830 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   p);.  }.}.#endi
23840 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
23850 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
23860 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  K */..#ifdef SQL
23870 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
23880 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
23890 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
238a0 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
238b0 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
238c0 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75   or DELETE pre-u
238d0 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74  pdate call,.** t
238e0 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65  hen cursor passe
238f0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23900 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
23910 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77  point to the row
23920 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20   about.** to be 
23930 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
23940 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  d. If the applic
23950 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ation calls sqli
23960 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
23970 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75  d(),.** the requ
23980 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ired value will 
23990 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
239a0 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20   row the cursor 
239b0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f  points to..*/.vo
239c0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
239d0 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56  eUpdateHook(.  V
239e0 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a00 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74  * Vdbe pre-updat
23a10 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e hook is invoke
23a20 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75  d by */.  VdbeCu
23a30 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
23a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
23a50 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e  sor to grab old.
23a60 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f  * values from */
23a70 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53     /* SQLITE_INS
23aa0 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
23ab0 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  ELETE */.  const
23ac0 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
23ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
23ae0 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
23af0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62   /* Modified tab
23b20 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  le */.  i64 iKey
23b30 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
23b40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
23b50 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  al key value */.
23b60 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
23b90 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a  r new.* record *
23ba0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23bb0 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36  db = v->db;.  i6
23bc0 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70  4 iKey2;.  PreUp
23bd0 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a  date preupdate;.
23be0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
23bf0 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl = pTab->zName
23c00 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
23c10 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65   u8 fakeSortOrde
23c20 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
23c30 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
23c40 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
23c50 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73  &preupdate, 0, s
23c60 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29  izeof(PreUpdate)
23c70 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69  );.  if( HasRowi
23c80 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  d(pTab)==0 ){.  
23c90 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20    iKey1 = iKey2 
23ca0 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61  = 0;.    preupda
23cb0 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  te.pPk = sqlite3
23cc0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
23cd0 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
23ce0 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
23cf0 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
23d00 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d     iKey2 = v->aM
23d10 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20  em[iReg].u.i;.  
23d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
23d30 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key2 = iKey1;.  
23d40 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
23d50 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  t( pCsr->nField=
23d60 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20  =pTab->nCol .   
23d70 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46      || (pCsr->nF
23d80 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
23d90 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  +1 && op==SQLITE
23da0 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d  _DELETE && iReg=
23db0 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65  =-1).  );..  pre
23dc0 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20  update.v = v;.  
23dd0 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d  preupdate.pCsr =
23de0 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61   pCsr;.  preupda
23df0 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72  te.op = op;.  pr
23e00 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20  eupdate.iNewReg 
23e10 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64  = iReg;.  preupd
23e20 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d  ate.keyinfo.db =
23e30 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65   db;.  preupdate
23e40 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45  .keyinfo.enc = E
23e50 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64  NC(db);.  preupd
23e60 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65  ate.keyinfo.nFie
23e70 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ld = pTab->nCol;
23e80 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23e90 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20  info.aSortOrder 
23ea0 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74  = (u8*)&fakeSort
23eb0 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61  Order;.  preupda
23ec0 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31  te.iKey1 = iKey1
23ed0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b  ;.  preupdate.iK
23ee0 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70  ey2 = iKey2;.  p
23ef0 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20  reupdate.pTab = 
23f00 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72  pTab;..  db->pPr
23f10 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70  eUpdate = &preup
23f20 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65  date;.  db->xPre
23f30 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
23f40 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
23f50 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  , db, op, zDb, z
23f60 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79  Tbl, iKey1, iKey
23f70 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  2);.  db->pPreUp
23f80 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  date = 0;.  sqli
23f90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72  te3DbFree(db, pr
23fa0 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29  eupdate.aRecord)
23fb0 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
23fc0 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
23fd0 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c  te.keyinfo.nFiel
23fe0 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
23ff0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62  Unpacked);.  vdb
24000 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62  eFreeUnpacked(db
24010 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69  , preupdate.keyi
24020 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31 2c 20 70 72  nfo.nField+1, pr
24030 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61  eupdate.pNewUnpa
24040 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65  cked);.  if( pre
24050 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20  update.aNew ){. 
24060 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
24070 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
24080 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
24090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
240a0 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64  mRelease(&preupd
240b0 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20  ate.aNew[i]);.  
240c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
240d0 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
240e0 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d  ate.aNew);.  }.}
240f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
24100 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
24110 54 45 5f 48 4f 4f 4b 20 2a 2f 0a                 TE_HOOK */.