/ Hex Artifact Content
Login

Artifact 1ee77344fe9fd6ac11fae6f0150f81e0eadf349a9957340089cf82284e6b379a:


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 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
15c0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
15d0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74  Op[i]);.    test
15e0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
15f0: 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t();.  }.#endif.
1600: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
1610: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
1620: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1630: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
1640: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1650: 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d  _COVERAGE.  pOp-
1660: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23  >iSrcLine = 0;.#
1670: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
1680: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1690: 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a  dbeAddOp0(Vdbe *
16a0: 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65  p, int op){.  re
16b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c  AddOp3(p, op, 0,
16d0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
16e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
1700: 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75   int p1){.  retu
1710: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1720: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1730: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
1740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56  ite3VdbeAddOp2(V
1750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1760: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
1770: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1780: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1790: 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d  p, p1, p2, 0);.}
17a0: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
17b0: 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64  de for an uncond
17c0: 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20  itional jump to 
17d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73  instruction iDes
17e0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
17f0: 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70  VdbeGoto(Vdbe *p
1800: 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20  , int iDest){.  
1810: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1820: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47  beAddOp3(p, OP_G
1830: 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30  oto, 0, iDest, 0
1840: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
1850: 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20  e code to cause 
1860: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20  the string zStr 
1870: 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  to be loaded int
1880: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44  o.** register iD
1890: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
18a0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
18b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
18c0: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
18d0: 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e  *zStr){.  return
18e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f0: 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(p, OP_String8
1900: 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a  , 0, iDest, 0, z
1910: 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str, 0);.}../*.*
1920: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1930: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1940: 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74   multiple regist
1950: 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72  ers to string or
1960: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
1970: 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  tants.  The regi
1980: 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68  sters begin with
1990: 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65   iDest and incre
19a0: 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c  ase consecutivel
19b0: 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74  y..** One regist
19c0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
19d0: 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  d for each chara
19e0: 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b  cgter in zTypes[
19f0: 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20  ].  For each.** 
1a00: 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e  "s" character in
1a10: 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72   zTypes[], the r
1a20: 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72  egister is a str
1a30: 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d  ing if the argum
1a40: 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55  ent is.** not NU
1a50: 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69  LL, or OP_Null i
1a60: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1a70: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20   null pointer.  
1a80: 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61  For each "i" cha
1a90: 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79  racter.** in zTy
1aa0: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1ab0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1ac0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
1ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1ae0: 6e 70 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73  nput string does
1af0: 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58   not end with "X
1b00: 22 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73  " then an OP_Res
1b10: 75 6c 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69  ultRow instructi
1b20: 6f 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  on.** is generat
1b30: 65 64 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ed for the value
1b40: 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76  s inserted..*/.v
1b50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
1b60: 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70  ultiLoad(Vdbe *p
1b70: 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e  , int iDest, con
1b80: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c  st char *zTypes,
1b90: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1ba0: 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   ap;.  int i;.  
1bb0: 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61  char c;.  va_sta
1bc0: 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a  rt(ap, zTypes);.
1bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
1be0: 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69  zTypes[i])!=0; i
1bf0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
1c00: 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  's' ){.      con
1c10: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f  st char *z = va_
1c20: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1c30: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
1c40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1c50: 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20   z==0 ? OP_Null 
1c60: 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  : OP_String8, 0,
1c70: 20 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20   iDest+i, 0, z, 
1c80: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
1c90: 28 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  ( c=='i' ){.    
1ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb0: 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(p, OP_Intege
1cc0: 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  r, va_arg(ap, in
1cd0: 74 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20  t), iDest+i);.  
1ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1cf0: 6f 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75  oto skip_op_resu
1d00: 6c 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d  ltrow;.    }.  }
1d10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d20: 64 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(p, OP_Resul
1d30: 74 52 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b  tRow, iDest, i);
1d40: 0a 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72  .skip_op_resultr
1d50: 6f 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  ow:.  va_end(ap)
1d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1d70: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1d80: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1d90: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1da0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1db0: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1dc0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1dd0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1de0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
1df0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1e00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e10: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
1e20: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
1e30: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
1e40: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e60: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1e70: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e90: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1eb0: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1ed0: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1ee0: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
1ef0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
1f00: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f10: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1f20: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1f30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1f40: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1f50: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1f60: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1f70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1f80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1f90: 70 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  p4 value with a 
1fa0: 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50  P4_INT64 or.** P
1fb0: 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a  4_REAL type..*/.
1fc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1fd0: 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62  ddOp4Dup8(.  Vdb
1fe0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ff0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
2000: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
2010: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2020: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2030: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
2040: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2050: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
2060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2080: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
2090: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
20b0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
20c0: 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20  onst u8 *zP4,   
20d0: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
20e0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
20f0: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
2100: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
2110: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
2120: 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  4copy = sqlite3D
2130: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c  bMallocRawNN(sql
2140: 69 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38  ite3VdbeDb(p), 8
2150: 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20  );.  if( p4copy 
2160: 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c  ) memcpy(p4copy,
2170: 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75   zP4, 8);.  retu
2180: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
2190: 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp4(p, op, p1, 
21a0: 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20  p2, p3, p4copy, 
21b0: 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e  p4type);.}..#ifn
21c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65  EXPLAIN./*.** Re
21e0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
21f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2200: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2210: 41 4e 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20  AN baseline..** 
2220: 30 20 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a  0 means "none"..
2230: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2240: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2250: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2260: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2270: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
2280: 72 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  rExplain==0 ) re
2290: 74 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20  turn 0;.  pOp = 
22a0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
22b0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
22d0: 61 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ain);.  return p
22e0: 4f 70 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op->p2;.}../*.**
22f0: 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78   Add a new OP_Ex
2300: 70 6c 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  plain opcode..**
2310: 0a 2a 2a 20 49 66 20 74 68 65 20 62 50 75 73 68  .** If the bPush
2320: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
2330: 68 65 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70  hen make this op
2340: 63 6f 64 65 20 74 68 65 20 70 61 72 65 6e 74 20  code the parent 
2350: 66 6f 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  for.** subsequen
2360: 74 20 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c  t Explains until
2370: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
2380: 61 69 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c  ainPop() is call
2390: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
23a0: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50  te3VdbeExplain(P
23b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38  arse *pParse, u8
23c0: 20 62 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68   bPush, const ch
23d0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
23e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
23f0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2400: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
2410: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f  Vdbe *v;.    va_
2420: 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74  list ap;.    int
2430: 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73   iThis;.    va_s
2440: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2450: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
2460: 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73  e3VMPrintf(pPars
2470: 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29  e->db, zFmt, ap)
2480: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
2490: 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  ;.    v = pParse
24a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68  ->pVdbe;.    iTh
24b0: 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  is = v->nOp;.   
24c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24d0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
24e0: 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d  , iThis, pParse-
24f0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c  >addrExplain, 0,
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2510: 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f         zMsg, P4_
2520: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66  DYNAMIC);.    if
2530: 28 20 62 50 75 73 68 29 20 70 50 61 72 73 65 2d  ( bPush) pParse-
2540: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69  >addrExplain = i
2550: 54 68 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  This;.  }.}../*.
2560: 2a 2a 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41  ** Pop the EXPLA
2570: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74  IN QUERY PLAN st
2580: 61 63 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a  ack one level..*
2590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25a0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72  beExplainPop(Par
25b0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
25c0: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
25d0: 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  in = sqlite3Vdbe
25e0: 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50  ExplainParent(pP
25f0: 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  arse);.}.#endif 
2600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
2610: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
2620: 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65   Add an OP_Parse
2630: 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20  Schema opcode.  
2640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2650: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a  broken out from.
2660: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
2670: 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20  dOp4() since it 
2680: 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65  needs to also ne
2690: 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20  eds to mark all 
26a0: 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76  btrees.** as hav
26b0: 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a  ing been used..*
26c0: 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20  *.** The zWhere 
26d0: 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65  string must have
26e0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
26f0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
2700: 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  oc()..** This ro
2710: 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20  utine will take 
2720: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
2730: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
2740: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
2750: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
2760: 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20  hemaOp(Vdbe *p, 
2770: 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a  int iDb, char *z
2780: 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b  Where){.  int j;
2790: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
27a0: 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65  dOp4(p, OP_Parse
27b0: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
27c0: 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59  0, zWhere, P4_DY
27d0: 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d  NAMIC);.  for(j=
27e0: 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b  0; j<p->db->nDb;
27f0: 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62   j++) sqlite3Vdb
2800: 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29  eUsesBtree(p, j)
2810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2820: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
2830: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
2840: 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65  lue as an intege
2850: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a  3VdbeAddOp4Int(.
2870: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
2880: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
2890: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
28a0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28c0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
28d0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
28f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2900: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
2910: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
2920: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2940: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
2950: 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20  /.  int p4      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2970: 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20  4 operand as an 
2980: 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20  integer */.){.  
2990: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
29a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
29b0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
29c0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
29d0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
29e0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
29f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
2a00: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
2a10: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
2a20: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34    pOp->p4.i = p4
2a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2a40: 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72  ddr;.}../* Inser
2a50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63  t the end of a c
2a60: 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69  o-routine.*/.voi
2a70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64  d sqlite3VdbeEnd
2a80: 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a  Coroutine(Vdbe *
2a90: 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29  v, int regYield)
2aa0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
2ab0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
2ac0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
2ad0: 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  ld);..  /* Clear
2ae0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72   the temporary r
2af0: 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74  egister cache, t
2b00: 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20  hereby ensuring 
2b10: 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63  that each.  ** c
2b20: 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74  o-routine has it
2b30: 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e  s own independen
2b40: 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65  t set of registe
2b50: 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72  rs, because co-r
2b60: 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67  outines.  ** mig
2b70: 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20  ht expect their 
2b80: 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20  registers to be 
2b90: 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73  preserved across
2ba0: 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e   an OP_Yield, an
2bb0: 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c  d.  ** that coul
2bc0: 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
2bd0: 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
2be0: 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20  co-routines are 
2bf0: 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
2c00: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65   ** temporary re
2c10: 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76  gister..  */.  v
2c20: 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ->pParse->nTempR
2c30: 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61  eg = 0;.  v->pPa
2c40: 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2c50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2c60: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
2c70: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
2c80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
2c90: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
2ca0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
2cb0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
2cc0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
2cd0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
2ce0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
2cf0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
2d00: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
2d10: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
2d20: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
2d30: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
2d40: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
2d50: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
2d60: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
2d70: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
2d80: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
2d90: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
2da0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
2db0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
2dc0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
2dd0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
2de0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
2df0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
2e00: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
2e10: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
2e20: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
2e30: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
2e40: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
2e50: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
2e60: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
2e70: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
2e80: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
2e90: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
2ea0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
2ed0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2ee0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
2ef0: 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  v){.  Parse *p =
2f00: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
2f10: 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b  t i = p->nLabel+
2f20: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  +;.  assert( v->
2f30: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2f40: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2f50: 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29  (i & (i-1))==0 )
2f60: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  {.    p->aLabel 
2f70: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2f80: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
2f90: 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20  p->aLabel, .    
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f     (i*2+1)*sizeo
2fd0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29  f(p->aLabel[0]))
2fe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
2ff0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
3000: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a  aLabel[i] = -1;.
3010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44    }.  return ADD
3020: 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  R(i);.}../*.** R
3030: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
3040: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
3050: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3060: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
3070: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
3080: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
3090: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
30a0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
30b0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
30c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
30d0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
30e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30f0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  lveLabel(Vdbe *v
3100: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73  , int x){.  Pars
3110: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
3120: 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52  ;.  int j = ADDR
3130: 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  (x);.  assert( v
3140: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3150: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
3160: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65  sert( j<p->nLabe
3170: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  l );.  assert( j
3180: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3190: 61 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66  aLabel ){.#ifdef
31a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
31b0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
31c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
31d0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
31e0: 20 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f      printf("RESO
31f0: 4c 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20  LVE LABEL %d to 
3200: 25 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70  %d\n", x, v->nOp
3210: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
3220: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
3230: 4c 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29  Label[j]==(-1) )
3240: 3b 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20  ; /* Labels may 
3250: 6f 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64  only be resolved
3260: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e   once */.    p->
3270: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3280: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
3290: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
32a0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
32b0: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
32c0: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
32d0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
32e0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
32f0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
3300: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
3310: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
3320: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
3330: 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20  be run multiple 
3340: 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  times..*/.void s
3350: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
3360: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  le(Vdbe *p){.  p
3370: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
3380: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
3390: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
33a0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
33b0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
33c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
33d0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
33e0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
33f0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3400: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
3410: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
3420: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
3430: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
3440: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
3450: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
3460: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
3470: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
3480: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
3490: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
34a0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
34b0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
34c0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
34d0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
34e0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
34f0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
3520: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
3530: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3540: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3550: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
3560: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
3570: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
3580: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3590: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
35a0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
35b0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
35c0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
35d0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
35e0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
35f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3600: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
3610: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
3620: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
3630: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
3640: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
3650: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
3660: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
3670: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
3680: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3690: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
36a0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
36b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
36c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
36d0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
36e0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
36f0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
3720: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
3730: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
3740: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
3750: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
3760: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
3770: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
3780: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
3790: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
37a0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
37b0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
37c0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
37d0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
37e0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
37f0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
3800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
3810: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
3820: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
3830: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3840: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3860: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3870: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3880: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3890: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
38a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
38b0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
38c0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
38d0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
38e0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
38f0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
3900: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
3910: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
3920: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
3930: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3940: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3950: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3960: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3970: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3980: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3990: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
39a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
39b0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
39c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
39d0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
39e0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
39f0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
3a00: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
3a10: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
3a20: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
3a30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3a40: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3a50: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3a60: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3a70: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3a80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3a90: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3ab0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3ac0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
3ad0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
3ae0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
3af0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
3b00: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
3b10: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
3b20: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
3b30: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3b40: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3b50: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3b60: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3b70: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3b80: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3b90: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3ba0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3bc0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
3bd0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3be0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3bf0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
3c00: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
3c10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
3c20: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
3c30: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3c40: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3c50: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3c60: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3c70: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3c80: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3c90: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3ca0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3cb0: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72   *  OP_CreateBtr
3cc0: 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  ee/BTREE_INTKEY 
3cd0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
3ce0: 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66  tine .**      (f
3cf0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
3d00: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
3d10: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
3d20: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
3d30: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3d40: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3d50: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3d60: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3d70: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3d80: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3d90: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3da0: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3db0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3dc0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
3dd0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
3de0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
3df0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
3e00: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
3e10: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
3e20: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
3e30: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3e40: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3e50: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3e60: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3e70: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3e80: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3e90: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3ea0: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3eb0: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3ec0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3ed0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
3ee0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
3ef0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
3f00: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
3f10: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
3f20: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3f30: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3f40: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3f50: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3f60: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3f70: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3f80: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3f90: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3fa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3fb0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3fc0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3fd0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
3fe0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
3ff0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
4000: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
4010: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
4020: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
4030: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
4040: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
4050: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
4060: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
4070: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
4080: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4090: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
40a0: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
40b0: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20  =BTREE_INTKEY ) 
40c0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
40d0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
40e0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
40f0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
4100: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
4110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4120: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4130: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4140: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
4150: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
4160: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
4170: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
4180: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4190: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
41a0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
41b0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
41c0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
41d0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
41e0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
41f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
4200: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
4210: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
4220: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
4230: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
4240: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
4250: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
4260: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
4270: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
4280: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
4290: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
42a0: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
42b0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
42c0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
42d0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
42e0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
42f0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
4300: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
4310: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
4320: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
4340: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
4350: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
4360: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
4370: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
4380: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
4390: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
43a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  function */..#if
43b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
43c0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
43d0: 20 74 68 65 20 6e 57 72 69 74 65 20 63 6f 75 6e   the nWrite coun
43e0: 74 65 72 20 69 6e 20 74 68 65 20 56 44 42 45 20  ter in the VDBE 
43f0: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
4400: 20 6e 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65 6d   not an.** ephem
4410: 65 72 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72 20  eral cursor, or 
4420: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 72  if the cursor ar
4430: 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a  gument is NULL..
4440: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4450: 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
4460: 74 65 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ter(Vdbe *p, Vdb
4470: 65 43 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20 20  eCursor *pC){.  
4480: 69 66 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c 20  if( pC==0.   || 
4490: 28 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43  (pC->eCurType!=C
44a0: 55 52 54 59 50 45 5f 53 4f 52 54 45 52 0a 20 20  URTYPE_SORTER.  
44b0: 20 20 20 20 20 26 26 20 70 43 2d 3e 65 43 75 72       && pC->eCur
44c0: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53  Type!=CURTYPE_PS
44d0: 45 55 44 4f 0a 20 20 20 20 20 20 20 26 26 20 21  EUDO.       && !
44e0: 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 29  pC->isEphemeral)
44f0: 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57 72  .  ){.    p->nWr
4500: 69 74 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ite++;.  }.}.#en
4510: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4520: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41  TE_DEBUG./*.** A
4530: 73 73 65 72 74 20 69 66 20 61 6e 20 41 62 6f 72  ssert if an Abor
4540: 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  t at this point 
4550: 69 6e 20 74 69 6d 65 20 6d 69 67 68 74 20 72 65  in time might re
4560: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70  sult in a corrup
4570: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  t.** database..*
4580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4590: 62 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c  beAssertAbortabl
45a0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  e(Vdbe *p){.  as
45b0: 73 65 72 74 28 20 70 2d 3e 6e 57 72 69 74 65 3d  sert( p->nWrite=
45c0: 3d 30 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74 6d  =0 || p->usesStm
45d0: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65  tJournal );.}.#e
45e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
45f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4600: 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ed after all opc
4610: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
4620: 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f  nserted.  It loo
4630: 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  ps.** through al
4640: 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e  l the opcodes an
4650: 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20  d fixes up some 
4660: 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28  details..**.** (
4670: 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70  1) For each jump
4680: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74   instruction wit
4690: 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  h a negative P2 
46a0: 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a  value (a label).
46b0: 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74  **     resolve t
46c0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61  he P2 value to a
46d0: 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73  n actual address
46e0: 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70  ..**.** (2) Comp
46f0: 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ute the maximum 
4700: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
4710: 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20  nts used by any 
4720: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  SQL function.** 
4730: 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68      and store th
4740: 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61  at value in *pMa
4750: 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a  xFuncArgs..**.**
4760: 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20   (3) Update the 
4770: 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e  Vdbe.readOnly an
4780: 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72  d Vdbe.bIsReader
4790: 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61   flags to accura
47a0: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69  tely.**     indi
47b0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72  cate what the pr
47c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
47d0: 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a   actually does..
47e0: 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61  **.** (4) Initia
47f0: 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76  lize the p4.xAdv
4800: 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  ance pointer on 
4810: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65  opcodes that use
4820: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52   it..**.** (5) R
4830: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
4840: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  y allocated for 
4850: 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a  storing labels..
4860: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4870: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e  ne will only fun
4880: 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20  ction correctly 
4890: 69 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  if the mkopcodeh
48a0: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a  .tcl generator.*
48b0: 2a 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73  * script numbers
48c0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72   the opcodes cor
48d0: 72 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73  rectly.  Changes
48e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
48f0: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72   must be.** coor
4900: 64 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61  dinated with cha
4910: 6e 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65  nges to mkopcode
4920: 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  h.tcl..*/.static
4930: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
4940: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
4950: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
4960: 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  ){.  int nMaxArg
4970: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
4980: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
4990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
49a0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
49b0: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
49c0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
49d0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
49e0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
49f0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
4a00: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77  p[p->nOp-1];.  w
4a10: 68 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a  hile(1){..    /*
4a20: 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64   Only JUMP opcod
4a30: 65 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74  es and the short
4a40: 20 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c   list of special
4a50: 20 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20   opcodes in the 
4a60: 73 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65  switch.    ** be
4a70: 6c 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63  low need to be c
4a80: 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20  onsidered.  The 
4a90: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65  mkopcodeh.tcl ge
4aa0: 6e 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67  nerator script g
4ab0: 72 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c  roups.    ** all
4ac0: 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74   these opcodes t
4ad0: 6f 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65  ogether near the
4ae0: 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70   front of the op
4af0: 63 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70  code list.  Skip
4b00: 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f  .    ** any opco
4b10: 64 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  de that does not
4b20: 20 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67   need processing
4b30: 20 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74   by virtual of t
4b40: 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20  he fact that.   
4b50: 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72   ** it is larger
4b60: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f   than SQLITE_MX_
4b70: 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20  JUMP_OPCODE, as 
4b80: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
4b90: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
4ba0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  */.    if( pOp->
4bb0: 6f 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d  opcode<=SQLITE_M
4bc0: 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b  X_JUMP_OPCODE ){
4bd0: 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  .      /* NOTE: 
4be0: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
4bf0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20  e mkopcodeh.tcl 
4c00: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
4c10: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a  emoving.      **
4c20: 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73   cases from this
4c30: 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20   switch! */.    
4c40: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
4c50: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
4c60: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
4c70: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
4c80: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30    if( pOp->p2!=0
4c90: 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   ) p->readOnly =
4ca0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   0;.          /*
4cb0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
4cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4cd0: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
4ce0: 69 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  it:.        case
4cf0: 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b   OP_Savepoint: {
4d00: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
4d10: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4d20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4d30: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
4d50: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4d60: 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64  Checkpoint:.#end
4d70: 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  if.        case 
4d80: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
4d90: 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e     case OP_Journ
4da0: 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20  alMode: {.      
4db0: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
4dc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
4dd0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
4de0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4df0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4e00: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4e10: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4e20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
4e30: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4e40: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
4e50: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
4e60: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
4e70: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
4e80: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E;.          /* 
4e90: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
4ea0: 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61  or never codes a
4eb0: 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f  ny of these opco
4ec0: 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20  des as a jump.  
4ed0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20          ** to a 
4ee0: 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65  label.  They are
4ef0: 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73   always coded as
4f00: 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64   a jump backward
4f10: 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20  s to a .        
4f20: 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65    ** known addre
4f30: 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ss */.          
4f40: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
4f50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
4f60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4f70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4f80: 5f 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20  _Prev: {.       
4f90: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4fa0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4fb0: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4fc0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4fd0: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4ff0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
5000: 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20  never codes any 
5010: 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73  of these opcodes
5020: 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20   as a jump.     
5030: 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62       ** to a lab
5040: 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c  el.  They are al
5050: 77 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20  ways coded as a 
5060: 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74  jump backwards t
5070: 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a  o a .          *
5080: 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20  * known address 
5090: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
50a0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20  ert( pOp->p2>=0 
50b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
50c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ak;.        }.#i
50d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5100: 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20  Update: {.      
5110: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
5120: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5130: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
5140: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5160: 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65    case OP_VFilte
5170: 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r: {.          i
5180: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
5190: 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70  assert( (pOp - p
51a0: 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20  ->aOp) >= 3 );. 
51b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
51c0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
51d0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
51e0: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70           n = pOp
51f0: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20  [-1].p1;.       
5200: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
5210: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
5220: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;.          /* F
5230: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
5240: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73   the default cas
5250: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23  e */.        }.#
5260: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65  endif.        de
5270: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
5280: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30     if( pOp->p2<0
5290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
52a0: 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  /* The mkopcodeh
52b0: 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20  .tcl script has 
52c0: 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e  so arranged thin
52d0: 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79  gs that the only
52e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
52f0: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
5300: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
5310: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
5320: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
5330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
5340: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
5350: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
5360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5370: 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33  assert( (sqlite3
5380: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
5390: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
53a0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a  FLG_JUMP)!=0 );.
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
53c0: 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32  rt( ADDR(pOp->p2
53d0: 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  )<pParse->nLabel
53e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
53f0: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
5400: 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b  [ADDR(pOp->p2)];
5410: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f        /* The mko
5450: 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70  pcodeh.tcl scrip
5460: 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65  t has so arrange
5470: 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68  d things that th
5480: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  e only.      ** 
5490: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
54a0: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
54b0: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
54c0: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
54d0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e  .      ** have n
54e0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
54f0: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5500: 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c      assert( (sql
5510: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
5520: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26  ty[pOp->opcode]&
5530: 4f 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c  OPFLG_JUMP)==0 |
5540: 7c 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20  | pOp->p2>=0);. 
5550: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
5560: 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b  ==p->aOp ) break
5570: 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d  ;.    pOp--;.  }
5580: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5590: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
55a0: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
55b0: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
55c0: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
55d0: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
55e0: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
55f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
5600: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
5610: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
5620: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
5630: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5640: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
5650: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
5660: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
5670: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5680: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
5690: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
56a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
56b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
56c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
56d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
56e0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
56f0: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
5700: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
5710: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5720: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
5730: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
5740: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
5750: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
5760: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
5770: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
5780: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
5790: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
57a0: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
57b0: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
57c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
57d0: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
57e0: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
57f0: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
5800: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
5810: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
5820: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
5830: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
5840: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
5850: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
5860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5870: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
5880: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
5890: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
58a0: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
58b0: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
58c0: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
58d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
58e0: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
58f0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
5900: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5910: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
5920: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
5930: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5940: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5950: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
5960: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
5970: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
5980: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
5990: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
59a0: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
59b0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
59c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
59d0: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
59e0: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
59f0: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
5a00: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
5a10: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
5a20: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
5a30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5a40: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
5a50: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
5a60: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
5a70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
5a80: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
5a90: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5aa0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
5ab0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
5ac0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
5ad0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
5ae0: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
5af0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5b00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
5b10: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
5b20: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
5b30: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
5b40: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
5b50: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
5b60: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
5b70: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
5b80: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
5b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5ba0: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
5bb0: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
5bc0: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
5bd0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
5be0: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
5bf0: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
5c00: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
5c10: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
5c20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
5c30: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5c40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5c50: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
5c60: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
5c70: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
5c80: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5c90: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
5ca0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
5cb0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
5cc0: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
5cd0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
5ce0: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
5cf0: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
5d00: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
5d10: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
5d20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
5d30: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
5d40: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
5d50: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
5d60: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
5d70: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
5d80: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
5d90: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
5da0: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
5db0: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
5dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
5dd0: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
5de0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
5df0: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
5e00: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
5e10: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
5e20: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5e30: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
5e40: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
5e50: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
5e60: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
5e70: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
5e80: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
5e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5ea0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
5eb0: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
5ec0: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
5ed0: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
5ee0: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
5ef0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
5f00: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
5f10: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
5f20: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
5f30: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
5f40: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
5f50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
5f70: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
5f80: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
5f90: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
5fa0: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
5fb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
5fc0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
5fd0: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
5fe0: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
5ff0: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6000: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
6010: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
6020: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
6030: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
6040: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
6050: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
6060: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6070: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6080: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6090: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
60a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
60b0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
60c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
60d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6100: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6110: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6120: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6130: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6140: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6150: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6180: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6190: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
61a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
61b0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
61c0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
61d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
61e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
61f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6200: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6210: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
6220: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
6230: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
6240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6250: 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75  }.  pFirst = pOu
6260: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  t = &p->aOp[p->n
6270: 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Op];.  for(i=0; 
6280: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b  i<nOp; i++, aOp+
6290: 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  +, pOut++){.    
62a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61  pOut->opcode = a
62b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
62c0: 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e  pOut->p1 = aOp->
62d0: 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32  p1;.    pOut->p2
62e0: 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = aOp->p2;.    
62f0: 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e  assert( aOp->p2>
6300: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73  =0 );.    if( (s
6310: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
6320: 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65  erty[aOp->opcode
6330: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
6340: 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20  =0 && aOp->p2>0 
6350: 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  ){.      pOut->p
6360: 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  2 += p->nOp;.   
6370: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20   }.    pOut->p3 
6380: 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70  = aOp->p3;.    p
6390: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
63a0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f  _NOTUSED;.    pO
63b0: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
63c0: 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a    pOut->p5 = 0;.
63d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
63e0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
63f0: 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e  MENTS.    pOut->
6400: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
6410: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
6420: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6430: 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c  .    pOut->iSrcL
6440: 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b  ine = iLineno+i;
6450: 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64  .#else.    (void
6460: 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66  )iLineno;.#endif
6470: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6480: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
6490: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
64a0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
64b0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
64c0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
64d0: 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61   i+p->nOp, &p->a
64e0: 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20  Op[i+p->nOp]);. 
64f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
6500: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
6510: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74  .  return pFirst
6520: 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
6530: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
6540: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a  TMT_SCANSTATUS).
6550: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74  /*.** Add an ent
6560: 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  ry to the array 
6570: 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61  of counters mana
6580: 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73  ged by sqlite3_s
6590: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29  tmt_scanstatus()
65a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
65b0: 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28  3VdbeScanStatus(
65c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20     /* VM to add 
65f0: 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20  scanstatus() to 
6600: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70  */.  int addrExp
6610: 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lain,           
6620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6630: 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f  of OP_Explain (o
6640: 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  r 0) */.  int ad
6650: 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  drLoop,         
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6670: 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75  ress of loop cou
6680: 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61  nter */ .  int a
6690: 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20  ddrVisit,       
66a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
66b0: 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69  dress of rows vi
66c0: 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f  sited counter */
66d0: 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20  .  LogEst nEst, 
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
6700: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
6710: 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74   rows */.  const
6720: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
6730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6740: 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69  me of table or i
6750: 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e  ndex being scann
6760: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ed */.){.  int n
6770: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e  Byte = (p->nScan
6780: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61  +1) * sizeof(Sca
6790: 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e  nStatus);.  Scan
67a0: 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20  Status *aNew;.  
67b0: 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74  aNew = (ScanStat
67c0: 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61  us*)sqlite3DbRea
67d0: 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lloc(p->db, p->a
67e0: 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Scan, nByte);.  
67f0: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
6800: 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77  ScanStatus *pNew
6810: 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61   = &aNew[p->nSca
6820: 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n++];.    pNew->
6830: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64  addrExplain = ad
6840: 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70  drExplain;.    p
6850: 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20  New->addrLoop = 
6860: 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e  addrLoop;.    pN
6870: 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  ew->addrVisit = 
6880: 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70  addrVisit;.    p
6890: 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74  New->nEst = nEst
68a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ;.    pNew->zNam
68b0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
68c0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Dup(p->db, zName
68d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20  );.    p->aScan 
68e0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65  = aNew;.  }.}.#e
68f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
6900: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6910: 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20   the opcode, or 
6920: 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50  P1, P2, P3, or P
6930: 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f  5 operands.** fo
6940: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
6950: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6960: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6970: 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  ngeOpcode(Vdbe *
6980: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20  p, u32 addr, u8 
6990: 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73  iNewOpcode){.  s
69a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
69b0: 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20  p,addr)->opcode 
69c0: 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a  = iNewOpcode;.}.
69d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
69e0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
69f0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
6a00: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
6a10: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
6a20: 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p1 = val;.}.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
6a40: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
6a50: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
6a60: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
6a70: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
6a80: 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p2 = val;.}.void
6a90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6aa0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
6ab0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
6ac0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
6ad0: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33  etOp(p,addr)->p3
6ae0: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
6af0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6b00: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20  P5(Vdbe *p, u16 
6b10: 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p5){.  assert( p
6b20: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62  ->nOp>0 || p->db
6b30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6b40: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  ;.  if( p->nOp>0
6b50: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
6b60: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
6b70: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6b80: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
6b90: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
6ba0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
6bb0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
6bc0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
6bd0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
6be0: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
6bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6c00: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
6c10: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
6c20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
6c30: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
6c40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6c50: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
6c60: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
6c70: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
6c80: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
6c90: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
6ca0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
6cb0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
6cc0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
6cd0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
6ce0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
6cf0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
6d00: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
6d10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
6d20: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
6d30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6d40: 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  NN(db, pDef);.  
6d50: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
6d60: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
6d70: 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a  (sqlite3 *, Op *
6d80: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  , int);../*.** D
6d90: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
6da0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6db0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
6dc0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
6dd0: 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20  eeP4Mem(sqlite3 
6de0: 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20  *db, Mem *p){.  
6df0: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
6e00: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
6e10: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
6e20: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6e30: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
6e40: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
6e50: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
6e60: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
6e70: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
6e80: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
6e90: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
6ea0: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
6ec0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
6ed0: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
6ee0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
6ef0: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
6f00: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  {.  assert( db )
6f10: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79  ;.  switch( p4ty
6f20: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6f30: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
6f40: 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78     freeP4FuncCtx
6f50: 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f  (db, (sqlite3_co
6f60: 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20  ntext*)p4);.    
6f70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6f80: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
6f90: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6fa0: 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  64:.    case P4_
6fb0: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73  DYNAMIC:.    cas
6fc0: 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20  e P4_DYNBLOB:.  
6fd0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6fe0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6ff0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
7000: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7010: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7020: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7030: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
7040: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
7050: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7060: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
7070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7080: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7090: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
70a0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
70b0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
70c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
70d0: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
70e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
70f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7100: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7110: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
7120: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
7130: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
7140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7150: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7160: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
7170: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7180: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
7190: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
71a0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
71b0: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
71c0: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
71d0: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
71e0: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
71f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7200: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
7210: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7220: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7230: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
7240: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
7250: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7270: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
7280: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
7290: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
72a0: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
72b0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
72c0: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
72d0: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
72e0: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
72f0: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7300: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
7310: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
7320: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7330: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
7340: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
7350: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
7360: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
7370: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
7380: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
7390: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
73a0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
73b0: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
73c0: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
73d0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
73e0: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
73f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7400: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
7410: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7420: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
7430: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
7440: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7450: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
7460: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7470: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
7480: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
7490: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
74a0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
74b0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
74c0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
74d0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
74e0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
74f0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
7500: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
7510: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
7520: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
7530: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7540: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7550: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
7560: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
7570: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
7580: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
7590: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
75a0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
75b0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
75c0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
75d0: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
75e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
75f0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
7600: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
7610: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
7620: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
7640: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
7650: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
7660: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
7670: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
7680: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
7690: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
76a0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
76b0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
76c0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
76d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
76e0: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
76f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
7700: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
7710: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
7720: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
7730: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
7740: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
7750: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
7760: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
7770: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
7780: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7790: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
77a0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
77b0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
77c0: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
77d0: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
77e0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
77f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7800: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
7810: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
7820: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7840: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
7850: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
7860: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
7870: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
7890: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
78a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
78b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
78c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
78d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
78e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
78f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
7900: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
7910: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
7920: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
7930: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
7940: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
7950: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
7960: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
7970: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
7980: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
7990: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
79a0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
79b0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
79c0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
79d0: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
79e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
79f0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
7a00: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
7a10: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
7a20: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
7a30: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
7a40: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
7a50: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
7a60: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
7a70: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
7a80: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7a90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7aa0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
7ab0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
7ac0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
7ad0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
7ae0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
7af0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
7b00: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
7b10: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
7b20: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7b30: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
7b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
7b50: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
7b60: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
7b70: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
7b80: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
7b90: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
7ba0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
7bb0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
7bc0: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
7bd0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
7be0: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
7bf0: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
7c00: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
7c10: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
7c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7c30: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
7c40: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
7c50: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
7c60: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
7c70: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7c80: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
7c90: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
7ca0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
7cb0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
7cc0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
7cd0: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
7ce0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7cf0: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
7d00: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
7d10: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
7d20: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
7d30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
7d40: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
7d50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7d60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
7d70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
7d80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7d90: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
7da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7db0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7dc0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
7dd0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
7de0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
7df0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
7e00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7e10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
7e20: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
7e30: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
7e40: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
7e50: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
7e60: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
7e70: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
7e80: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
7e90: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
7ea0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
7eb0: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
7ec0: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
7ed0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
7ee0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
7ef0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
7f00: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
7f10: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
7f20: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
7f30: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
7f40: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
7f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
7f60: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
7f70: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
7f80: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
7f90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
7fa0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
7fb0: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7fc0: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7fd0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7fe0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7ff0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
8000: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
8010: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
8020: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
8030: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
8040: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8050: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
8060: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
8070: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
8080: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
8090: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
80a0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
80b0: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
80c0: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
80d0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
80e0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
80f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
8100: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
8110: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
8120: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
8130: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
8140: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
8150: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
8160: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
8170: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
8180: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
8190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
81a0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
81b0: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
81c0: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
81d0: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
81e0: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
81f0: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
8200: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
8210: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
8220: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
8230: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
8240: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
8250: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
8260: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8270: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
8280: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
8290: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
82a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
82b0: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
82c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
82d0: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
82e0: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
82f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8300: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8310: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
8320: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
8330: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
8340: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
8350: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8360: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
8370: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
8380: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
8390: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
83a0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
83b0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
83c0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
83d0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
83e0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
83f0: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
8400: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
8410: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
8420: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
8430: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
8440: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8450: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8460: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
8470: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
8480: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
8490: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
84a0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
84b0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
84c0: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
84d0: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
84e0: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
84f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
8500: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
8510: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
8520: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
8530: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
8540: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
8550: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
8560: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
8570: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
8580: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8590: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
85a0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
85b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
85c0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
85d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
85e0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
85f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8600: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
8610: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8620: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
8630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
8640: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
8650: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
8660: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8670: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
8680: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8690: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
86a0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
86b0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
86c0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
86d0: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
86e0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
86f0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
8700: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
8710: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
8720: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
8730: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
8740: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
8750: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
8760: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
8770: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
8780: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
8790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
87a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
87b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
87c0: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
87d0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
87e0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
87f0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8800: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
8810: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
8820: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
8830: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
8840: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
8850: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8860: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
8870: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
8880: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
8890: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
88a0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
88b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
88c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
88d0: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
88e0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
88f0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
8900: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
8910: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
8920: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8930: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
8940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
8950: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
8960: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
8970: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
8980: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
8990: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
89a0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
89b0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
89c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
89d0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
89e0: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
89f0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
8a00: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
8a10: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
8a20: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
8a30: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
8a40: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
8a50: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
8a60: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
8a70: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
8a80: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
8a90: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
8aa0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
8ab0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
8ac0: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
8ad0: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
8ae0: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
8af0: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
8b00: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
8b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
8b20: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
8b30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8b40: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
8b50: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
8b60: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
8b70: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
8b80: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
8b90: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
8ba0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
8bb0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
8bc0: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
8bd0: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
8be0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
8bf0: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
8c00: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
8c10: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
8c20: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
8c30: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
8c40: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
8c50: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
8c60: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
8c70: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
8c80: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
8c90: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
8ca0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
8cb0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
8cc0: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
8cd0: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
8ce0: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
8cf0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8d00: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
8d10: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
8d20: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
8d30: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
8d40: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
8d50: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
8d60: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8d70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8d80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8d90: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
8da0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
8db0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
8dc0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
8dd0: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
8de0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8df0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8e00: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
8e10: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
8e20: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
8e30: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
8e40: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
8e50: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
8e60: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
8e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
8e80: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
8e90: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
8ea0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
8eb0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
8ec0: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
8ed0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
8ee0: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
8ef0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
8f00: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
8f10: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
8f20: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
8f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8f40: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
8f50: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
8f60: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
8f70: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
8f80: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
8f90: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
8fa0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
8fb0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
8fc0: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
8fd0: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
8fe0: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
8ff0: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
9000: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
9010: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
9020: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
9030: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
9040: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
9050: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
9060: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
9070: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
9080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
9090: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
90a0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
90b0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
90c0: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
90d0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
90e0: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
90f0: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
9100: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
9110: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
9120: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
9130: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
9140: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9150: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
9160: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
9170: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
9180: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
9190: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
91a0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
91b0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
91c0: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
91d0: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
91e0: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
91f0: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
9200: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
9210: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
9220: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9230: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
9240: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
9250: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
9260: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9270: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
9280: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
9290: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
92a0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
92b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
92c0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
92d0: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
92e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
92f0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
9300: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
9310: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
9320: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
9330: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
9340: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
9350: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
9360: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9370: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
9380: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
9390: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
93a0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
93b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
93c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
93d0: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
93e0: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
93f0: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9410: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9420: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9430: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
9440: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
9450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9460: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
9470: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
9480: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
9490: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
94a0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
94b0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
94c0: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
94d0: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
94e0: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
94f0: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
9500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9510: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
9520: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
9530: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
9540: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
9550: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9560: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9570: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9580: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
9590: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
95a0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
95b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
95c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
95d0: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
95e0: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
95f0: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
9600: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9610: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
9620: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
9630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
9640: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
9650: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
9660: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9670: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
9680: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
9690: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
96a0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
96b0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
96c0: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
96d0: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
96e0: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
96f0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
9700: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
9720: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
9730: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
9740: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9750: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
9760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9770: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9780: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9790: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
97a0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
97b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
97c0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
97d0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
97e0: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
97f0: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
9800: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
9810: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
9820: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9830: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
9840: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
9850: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9860: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
9870: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
9880: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9890: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
98a0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
98b0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
98c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
98d0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
98e0: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
98f0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
9900: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
9910: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
9920: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
9930: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
9940: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
9950: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
9960: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
9970: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9980: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
9990: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
99a0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
99b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
99c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
99d0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
99e0: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
99f0: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
9a00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
9a10: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
9a20: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
9a30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9a40: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
9a50: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
9a60: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
9a70: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
9a80: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
9a90: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
9aa0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
9ab0: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
9ac0: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
9ad0: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
9ae0: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
9af0: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
9b00: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
9b10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9b20: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
9b30: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9b40: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
9b50: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
9b60: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
9b70: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
9b80: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
9b90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9ba0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
9bb0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9bc0: 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ndf(p, "%d", pEx
9bd0: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
9be0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9bf0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9c10: 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c  appendf(p, "NULL
9c20: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
9c30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
9c40: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
9c50: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
9c60: 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  df(p, "r[%d]", p
9c70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
9c80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
9ca0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
9cb0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9cc0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
9cd0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
9ce0: 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  f(p, "rowid");. 
9cf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9d10: 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22  appendf(p, "c%d"
9d20: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
9d30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
9d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9d50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
9d60: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
9d70: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9d80: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
9d90: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
9da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9db0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
9dc0: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
9dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9de0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
9df0: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
9e00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9e10: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
9e20: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
9e30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e40: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
9e50: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
9e60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
9e70: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
9e80: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9e90: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
9ea0: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
9eb0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9ec0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
9ed0: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ef0: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
9f00: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
9f10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9f20: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
9f30: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
9f40: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
9f50: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
9f60: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
9f70: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
9f80: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
9f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fa0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
9fb0: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
9fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9fd0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
9fe0: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
9ff0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a000: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
a010: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
a020: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
a030: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
a040: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
a050: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
a060: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
a070: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
a080: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
a090: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
a0a0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
a0b0: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
a0c0: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
a0d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a0e0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
a0f0: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
a100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a110: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
a120: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
a130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a140: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
a150: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
a160: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
a170: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
a180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a190: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
a1a0: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
a1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a1c0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
a1d0: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
a1e0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
a1f0: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
a200: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a210: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
a220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a230: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
a240: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a250: 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20  pendf(p, "%s(", 
a260: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
a270: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
a280: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
a290: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
a2a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a2b0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a2c0: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
a2d0: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
a2e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a2f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a300: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a310: 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  )", 1);.  }.}.#e
a320: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a330: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
a340: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
a350: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a  _CURSOR_HINTS) *
a360: 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  /...#if VDBE_DIS
a370: 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f  PLAY_P4./*.** Co
a380: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
a390: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
a3a0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
a3b0: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
a3c0: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
a3d0: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
a3e0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
a3f0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
a400: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
a410: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
a420: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
a430: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
a440: 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  emp;.  StrAccum 
a450: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  x;.  assert( nTe
a460: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69  mp>=20 );.  sqli
a470: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
a480: 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54  &x, 0, zTemp, nT
a490: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63  emp, 0);.  switc
a4a0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
a4b0: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
a4c0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
a4d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  nt j;.      KeyI
a4e0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
a4f0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
a500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a510: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
a520: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
a530: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a540: 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  endf(&x, "k(%d",
a550: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
a560: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
a570: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
a580: 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b  ->nKeyField; j++
a590: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
a5a0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
a5b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
a5c0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a5d0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
a5e0: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
a5f0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
a600: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
a610: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
a620: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
a630: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a640: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
a650: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
a660: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
a670: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20  aSortOrder[j] ? 
a680: 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29  "-" : "", zColl)
a690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a6a0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a6b0: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
a6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6d0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a6e0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
a6f0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
a700: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
a710: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
a720: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
a730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a740: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
a750: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
a760: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
a770: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
a780: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
a790: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a7a0: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
a7b0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
a7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
a7e0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
a7f0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
a800: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
a810: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a820: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
a830: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
a840: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
a850: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a860: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
a870: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
a880: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
a890: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
a8a0: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
a8b0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
a8c0: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
a8d0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
a8e0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a8f0: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
a900: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
a910: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
a920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
a930: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
a940: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
a950: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a960: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
a970: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
a980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a990: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
a9a0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
a9b0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a9c0: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
a9d0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
a9e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a9f0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
aa00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
aa10: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
aa20: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
aa30: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
aa40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
aa50: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
aa60: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
aa70: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
aa80: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
aa90: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
aaa0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
aab0: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
aac0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
aad0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
aae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aaf0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
ab00: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
ab10: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
ab20: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
ab30: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
ab40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
ab50: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
ab60: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
ab70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ab80: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
ab90: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
aba0: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
abb0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
abc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
abe0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
abf0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
ac00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ac10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ac20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ac30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ac40: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
ac50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ac60: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
ac70: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
ac80: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
ac90: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
aca0: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
acb0: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
acc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
acd0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
ace0: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
acf0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
ad00: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
ad10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
ad20: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
ad30: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
ad40: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
ad50: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
ad80: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
ad90: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
ada0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
adb0: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <=n; i++){.     
adc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
add0: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22  ppendf(&x, ",%d"
ade0: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
adf0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
ae00: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
ae10: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
ae20: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
ae30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ae40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
ae50: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
ae60: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ae70: 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61  endf(&x, "progra
ae80: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
ae90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aea0: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
aeb0: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
aec0: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
aed0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
aee0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
aef0: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
af10: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
af20: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
af30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
af40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
af50: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
af60: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
af70: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
af80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
af90: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
afa0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
afb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
afc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
afd0: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
afe0: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
aff0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
b000: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
b010: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
b020: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
b030: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
b040: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
b050: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
b060: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
b070: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
b080: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
b090: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
b0a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
b0b0: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
b0c0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
b0d0: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
b0e0: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
b0f0: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
b100: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
b110: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
b120: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
b130: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
b140: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
b150: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
b160: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
b170: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
b180: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
b190: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
b1a0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
b1b0: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
b1c0: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
b1d0: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
b1e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
b1f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
b200: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
b210: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
b220: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
b230: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
b240: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
b250: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
b260: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
b270: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
b280: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
b290: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b2a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
b2b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
b2c0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
b2d0: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
b2e0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
b2f0: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
b300: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
b310: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
b320: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
b330: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
b340: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
b350: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
b360: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
b370: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
b380: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
b390: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
b3a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
b3b0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
b3c0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
b3d0: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
b3e0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
b3f0: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
b400: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
b410: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
b420: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
b430: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
b440: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
b450: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
b460: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
b470: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
b480: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
b490: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
b4a0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
b4b0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
b4c0: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
b4d0: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
b4e0: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
b4f0: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
b500: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b510: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
b520: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
b530: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
b540: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
b550: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
b560: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
b570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b580: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
b590: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
b5a0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
b5b0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
b5c0: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
b5d0: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
b5e0: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
b5f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
b600: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
b610: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
b620: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
b630: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
b640: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
b650: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
b660: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
b670: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
b680: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
b690: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
b6a0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
b6b0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
b6c0: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
b6d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
b6e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b6f0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
b700: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
b710: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
b720: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
b730: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
b740: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
b750: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
b760: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
b770: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
b780: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
b790: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
b7a0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
b7b0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
b7c0: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
b7d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b7e0: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
b7f0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
b800: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
b810: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b820: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b830: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
b840: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
b850: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
b860: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
b870: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
b880: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b890: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
b8a0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
b8b0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
b8c0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
b8d0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
b8e0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
b8f0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
b900: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
b910: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
b920: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
b930: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
b940: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
b950: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
b960: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
b970: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
b980: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
b990: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b9a0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
b9b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
b9c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
b9d0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
b9e0: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
b9f0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
ba00: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
ba10: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
ba20: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
ba30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
ba40: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
ba50: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
ba60: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
ba70: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
ba80: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
ba90: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
baa0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
bab0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
bac0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
bad0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
bae0: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
baf0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
bb00: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
bb10: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
bb20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
bb30: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
bb40: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
bb50: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
bb60: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
bb70: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
bb80: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
bb90: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
bba0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
bbb0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
bbc0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
bbd0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
bbe0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
bbf0: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
bc00: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
bc10: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
bc20: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
bc30: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
bc40: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
bc50: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
bc60: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
bc70: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
bc80: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
bc90: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
bca0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
bcb0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
bcc0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
bcd0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
bce0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
bcf0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
bd00: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
bd10: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
bd20: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
bd30: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
bd40: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
bd50: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
bd60: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
bd70: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
bd80: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
bd90: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
bda0: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   element..*/.sta
bdb0: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d  tic void initMem
bdc0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
bdd0: 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t N, sqlite3 *db
bde0: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
bdf0: 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29  while( (N--)>0 )
be00: 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  {.    p->db = db
be10: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
be20: 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73   flags;.    p->s
be30: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66  zMalloc = 0;.#if
be40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
be50: 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72  .    p->pScopyFr
be60: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
be70: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f     p++;.  }.}../
be80: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
be90: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
bea0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
beb0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
bec0: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
bed0: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
bee0: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
bef0: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
bf00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bf10: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
bf20: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
bf30: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
bf40: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
bf50: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
bf60: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
bf70: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
bf80: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
bf90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
bfa0: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
bfb0: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
bfc0: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
bfd0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
bfe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
bff0: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
c000: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
c010: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
c020: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
c030: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
c040: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
c050: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
c060: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
c070: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
c080: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
c090: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
c0a0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
c0b0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
c0c0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
c0d0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
c0e0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
c0f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
c100: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
c110: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
c120: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
c130: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
c140: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
c150: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
c160: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
c170: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
c180: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
c190: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
c1a0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
c1b0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
c1c0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
c1d0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
c1e0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
c1f0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
c200: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
c210: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
c220: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
c230: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
c240: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
c250: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
c260: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
c270: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
c280: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
c290: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
c2a0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
c2b0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
c2c0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
c2d0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
c2e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
c2f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
c300: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
c310: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c320: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
c330: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
c340: 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d  stcase( p->xDel=
c350: 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d  =sqlite3VdbeFram
c360: 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20  eMemDel );.     
c370: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
c380: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
c390: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
c3a0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
c3b0: 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20  MEM_Dyn) ){.    
c3c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c3d0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
c3e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
c3f0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >szMalloc ){.   
c400: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
c410: 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  eeNN(db, p->zMal
c420: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
c430: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
c440: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
c450: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
c460: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
c470: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
c480: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
c490: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
c4a0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 70  ** Verify that p
c4b0: 46 72 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64  Frame is a valid
c4c0: 20 56 64 62 65 46 72 61 6d 65 20 70 6f 69 6e 74   VdbeFrame point
c4d0: 65 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  er.  Return true
c4e0: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 64   if it is.** and
c4f0: 20 66 61 6c 73 65 20 69 66 20 73 6f 6d 65 74 68   false if someth
c500: 69 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a  ing is wrong..**
c510: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c520: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72   is intended for
c530: 20 75 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61   use inside of a
c540: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c550: 74 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ts only..*/.int 
c560: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
c570: 49 73 56 61 6c 69 64 28 56 64 62 65 46 72 61 6d  IsValid(VdbeFram
c580: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69 66  e *pFrame){.  if
c590: 28 20 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65  ( pFrame->iFrame
c5a0: 4d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 46 52  Magic!=SQLITE_FR
c5b0: 41 4d 45 5f 4d 41 47 49 43 20 29 20 72 65 74 75  AME_MAGIC ) retu
c5c0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
c5d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
c5e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 73  ** This is a des
c5f0: 74 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65 6d  tructor on a Mem
c600: 20 6f 62 6a 65 63 74 20 28 77 68 69 63 68 20 69   object (which i
c610: 73 20 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c 69  s really an sqli
c620: 74 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74 68  te3_value).** th
c630: 61 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 46  at deletes the F
c640: 72 61 6d 65 20 6f 62 6a 65 63 74 20 74 68 61 74  rame object that
c650: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
c660: 69 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a  it as a blob..**
c670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c680: 20 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74 65   does not delete
c690: 20 74 68 65 20 46 72 61 6d 65 20 72 69 67 68 74   the Frame right
c6a0: 20 61 77 61 79 2e 20 20 49 74 20 6d 65 72 65 6c   away.  It merel
c6b0: 79 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 66 72  y adds the.** fr
c6c0: 61 6d 65 20 74 6f 20 61 20 6c 69 73 74 20 6f 66  ame to a list of
c6d0: 20 66 72 61 6d 65 73 20 74 6f 20 62 65 20 64 65   frames to be de
c6e0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 56  leted when the V
c6f0: 64 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f  dbe halts..*/.vo
c700: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
c710: 61 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20 2a  ameMemDel(void *
c720: 70 41 72 67 29 7b 0a 20 20 56 64 62 65 46 72 61  pArg){.  VdbeFra
c730: 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 28 56 64  me *pFrame = (Vd
c740: 62 65 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a 20  beFrame*)pArg;. 
c750: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c760: 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64  VdbeFrameIsValid
c770: 28 70 46 72 61 6d 65 29 20 29 3b 0a 20 20 70 46  (pFrame) );.  pF
c780: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  rame->pParent = 
c790: 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46  pFrame->v->pDelF
c7a0: 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  rame;.  pFrame->
c7b0: 76 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  v->pDelFrame = p
c7c0: 46 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Frame;.}.../*.**
c7d0: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
c7e0: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
c7f0: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
c800: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
c810: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
c820: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
c830: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
c840: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
c850: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c860: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
c870: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
c880: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
c890: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
c8a0: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
c8b0: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
c8c0: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
c8d0: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
c8e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c8f0: 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69  3VdbeFrameIsVali
c900: 64 28 70 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  d(p) );.  for(i=
c910: 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73  0; i<p->nChildCs
c920: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
c930: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
c940: 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69  or(p->v, apCsr[i
c950: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
c960: 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20  eMemArray(aMem, 
c970: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20  p->nChildMem);. 
c980: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
c990: 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e  teAuxData(p->v->
c9a0: 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61  db, &p->pAuxData
c9b0: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , -1, 0);.  sqli
c9c0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
c9d0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
c9e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
c9f0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
ca00: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
ca10: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
ca20: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
ca30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
ca40: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
ca50: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
ca60: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
ca70: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
ca80: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
ca90: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
caa0: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
cab0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
cac0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
cad0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
cae0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
caf0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
cb00: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
cb10: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
cb20: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
cb30: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
cb40: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
cb50: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
cb60: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
cb70: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
cb80: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
cb90: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
cba0: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
cbb0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
cbc0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
cbd0: 2a 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a 20 20  ** 2018-04-24:  
cbe0: 49 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  In p->explain==2
cbf0: 20 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e   mode, the OP_In
cc00: 69 74 20 6f 70 63 6f 64 65 73 20 6f 66 20 74 72  it opcodes of tr
cc10: 69 67 67 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c  iggers.** are al
cc20: 73 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61  so shown, so tha
cc30: 74 20 74 68 65 20 62 6f 75 6e 64 61 72 69 65 73  t the boundaries
cc40: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6d 61 69   between the mai
cc50: 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a  n program and.**
cc60: 20 65 61 63 68 20 74 72 69 67 67 65 72 20 61 72   each trigger ar
cc70: 65 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57  e clear..**.** W
cc80: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
cc90: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69  1, first the mai
cca0: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73  n program is lis
ccb0: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f  ted, then each o
ccc0: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  f.** the trigger
ccd0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
cce0: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f   listed one by o
ccf0: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
cd00: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
cd10: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
cd20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
cd30: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
cd40: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f   /* Stop when ro
cd70: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  w count reaches 
cd80: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  this */.  int nS
cd90: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cdb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
cdc0: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
cdd0: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
cde0: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ce00: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
ce10: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
ce20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ce40: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20  emory cell hold 
ce50: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
ce60: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
ce70: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ce90: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
cea0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
ceb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
cee0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
cef0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
cf00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
cf10: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
cf20: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
cf30: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Mem[1];         
cf40: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
cf50: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
cf60: 2f 0a 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62  /.  int bListSub
cf70: 70 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c  progs = (p->expl
cf80: 61 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66  ain==1 || (db->f
cf90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72  lags & SQLITE_Tr
cfa0: 69 67 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20  iggerEQP)!=0);. 
cfb0: 20 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20   Op *pOp = 0;.. 
cfc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
cfd0: 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ain );.  assert(
cfe0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
cff0: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61  MAGIC_RUN );.  a
d000: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
d010: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
d020: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
d030: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
d040: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  OMEM );..  /* Ev
d050: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
d060: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75  pcode does not u
d070: 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  se dynamic strin
d080: 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  gs for.  ** the 
d090: 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63  result, result c
d0a0: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d  olumns may becom
d0b0: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
d0c0: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
d0d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d0e0: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
d0f0: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
d100: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
d110: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ng..  */.  relea
d120: 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c  seMemArray(pMem,
d130: 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c   8);.  p->pResul
d140: 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  tSet = 0;..  if(
d150: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
d160: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  OMEM ){.    /* T
d170: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61  his happens if a
d180: 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65   malloc() inside
d190: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
d1a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
d1b0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
d1c0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
d1d0: 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20  () failed.  */. 
d1e0: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
d1f0: 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75  lt(db);.    retu
d200: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d210: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
d220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
d230: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
d240: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
d250: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
d260: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
d270: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
d280: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
d290: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
d2a0: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
d2b0: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
d2c0: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
d2d0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
d2e0: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
d2f0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
d300: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
d310: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
d320: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
d330: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
d340: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
d350: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
d360: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
d370: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
d380: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
d390: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
d3a0: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
d3b0: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
d3c0: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
d3d0: 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20  ( bListSubprogs 
d3e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
d3f0: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
d400: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
d410: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
d420: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
d430: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
d440: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
d450: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
d460: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
d470: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
d480: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
d490: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
d4a0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
d4b0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
d4c0: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
d4d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
d4e0: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
d4f0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
d500: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
d510: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
d520: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
d530: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
d540: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
d550: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
d560: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
d570: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
d580: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
d590: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
d5a0: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
d5b0: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
d5c0: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
d5d0: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
d5e0: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
d5f0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
d600: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
d610: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
d620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
d630: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
d640: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
d650: 20 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20    while(1){  /* 
d660: 4c 6f 6f 70 20 65 78 69 74 73 20 76 69 61 20 62  Loop exits via b
d670: 72 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20  reak */.    i = 
d680: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28  p->pc++;.    if(
d690: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
d6a0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
d6b0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _OK;.      rc = 
d6c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
d6d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d6e0: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
d6f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
d700: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
d710: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
d720: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
d730: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
d740: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
d750: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
d760: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
d770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d780: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
d790: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
d7a0: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
d7b0: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
d7c0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
d7d0: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
d7e0: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
d7f0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
d800: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
d810: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
d820: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
d830: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
d840: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
d850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d860: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
d870: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a  >aOp[i];.    }..
d880: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
d890: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
d8a0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
d8b0: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
d8c0: 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 61  hat has.    ** a
d8d0: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61   P4_SUBPROGRAM a
d8e0: 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64  rgument), expand
d8f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d900: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
d910: 67 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70  grams.    ** kep
d920: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
d930: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
d940: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
d950: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
d960: 67 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20  gram.    ** has 
d970: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
d980: 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   seen..    */.  
d990: 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 70 72    if( bListSubpr
d9a0: 6f 67 73 20 26 26 20 70 4f 70 2d 3e 70 34 74 79  ogs && pOp->p4ty
d9b0: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
d9c0: 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  M ){.      int n
d9d0: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
d9e0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
d9f0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
da00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
da10: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
da20: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
da30: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
da40: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
da50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
da60: 20 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20   j==nSub ){.    
da70: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
da80: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
da90: 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62  Sub, nByte, nSub
daa0: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
dab0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
dac0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
dad0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
dae0: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  R;.          bre
daf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
db00: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
db10: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
db20: 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61 70  b->z;.        ap
db30: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
db40: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
db50: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
db60: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
db70: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e  .        pSub->n
db80: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
db90: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
dba0: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70       nRow += pOp
dbb0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e  ->p4.pProgram->n
dbc0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
dbd0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  }.    if( p->exp
dbe0: 6c 61 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a  lain<2 ) break;.
dbf0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
dc00: 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode==OP_Explain 
dc10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
dc20: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
dc30: 5f 49 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e 31  _Init && p->pc>1
dc40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
dc50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dc60: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  OK ){.    if( db
dc70: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
dc80: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  ed ){.      p->r
dc90: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
dca0: 52 55 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d  RUPT;.      rc =
dcb0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
dcc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dcd0: 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33  Error(p, sqlite3
dce0: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a  ErrStr(p->rc));.
dcf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd00: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20   char *zP4;.    
dd10: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
dd20: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==1 ){.        p
dd30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
dd40: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  _Int;.        pM
dd50: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dd80: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
dd90: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  /.        pMem++
dda0: 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 70  ;.    .        p
ddb0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ddc0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
ddd0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
dde0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
ddf0: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
de00: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
de10: 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ); /* Opcode */.
de20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
de30: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
de40: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
de50: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
de60: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
de70: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
de80: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
de90: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20     pMem++;.     
dea0: 20 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   }..      pMem->
deb0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
dec0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
ded0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
df00: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
df10: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
df20: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
df30: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
df40: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df60: 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P2 */.      pMe
df70: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d  m++;..      pMem
df80: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
df90: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
dfa0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
dfd0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
dfe0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
dff0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
e000: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29  esize(pMem, 100)
e010: 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20   ){ /* P4 */.   
e020: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e030: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e040: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
e050: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
e060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e070: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e080: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
e090: 20 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c       zP4 = displ
e0a0: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
e0b0: 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f  z, pMem->szMallo
e0c0: 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  c);.      if( zP
e0d0: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  4!=pMem->z ){.  
e0e0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
e0f0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
e100: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
e110: 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53  pMem, zP4, -1, S
e120: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
e130: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
e150: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
e160: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
e170: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
e180: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  m->z);.        p
e190: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
e1a0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a  E_UTF8;.      }.
e1b0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
e1c0: 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c       if( p->expl
e1d0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
e1e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
e1f0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
e200: 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20  ze(pMem, 4) ){. 
e210: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
e220: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
e230: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
e240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e250: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
e260: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
e270: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
e280: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
e290: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
e2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
e2b0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
e2c0: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
e2d0: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
e2e0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
e2f0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
e300: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
e310: 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
e320: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
e330: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
e340: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
e350: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
e360: 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20  size(pMem, 500) 
e370: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
e380: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
e390: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
e3a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e3b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
e3c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65     }.        pMe
e3d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
e3e0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
e3f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
e400: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
e410: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
e420: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 20 20 70   500);.        p
e430: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
e440: 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20  E_UTF8;.#else.  
e450: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e460: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
e490: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  /.#endif.      }
e4a0: 0a 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43  ..      p->nResC
e4b0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
e4c0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
e4d0: 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65      p->pResultSe
e4e0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
e4f0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
e500: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
e510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
e520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
e530: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e540: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e550: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
e560: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
e570: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
e580: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
e590: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
e5a0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
e5b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
e5c0: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
e5d0: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
e5e0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
e5f0: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
e600: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
e610: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
e620: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
e630: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
e640: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
e650: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
e660: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
e670: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z!=0 ){.      z 
e680: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
e690: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
e6a0: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
e6b0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
e6c0: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22  if( z ) printf("
e6d0: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
e6e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
e6f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e700: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
e710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
e720: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
e730: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
e740: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
e750: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
e760: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e770: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
e780: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
e790: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
e7a0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
e7b0: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
e7c0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
e7d0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
e7e0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
e7f0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
e800: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
e810: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
e820: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
e830: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
e840: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
e850: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
e860: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
e870: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
e880: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
e890: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
e8a0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
e8b0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
e8c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e8d0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
e8e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
e8f0: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
e900: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
e910: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
e920: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e930: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
e940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e950: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
e960: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
e970: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
e980: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
e990: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
e9a0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
e9b0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
e9c0: 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  ./* An instance 
e9d0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64  of this object d
e9e0: 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65  escribes bulk me
e9f0: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
ea00: 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62  or use.** by sub
ea10: 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20  components of a 
ea20: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
ea30: 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c  nt.  Space is al
ea40: 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f  located out.** o
ea50: 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63  f a ReusableSpac
ea60: 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20  e object by the 
ea70: 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75  allocSpace() rou
ea80: 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73  tine below..*/.s
ea90: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
eaa0: 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61  ace {.  u8 *pSpa
eab0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ce;          /* 
eac0: 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  Available memory
ead0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
eae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
eaf0: 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
eb00: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
eb10: 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20   nNeeded;       
eb20: 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73    /* Total bytes
eb30: 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20   that could not 
eb40: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  be allocated */.
eb50: 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c  };../* Try to al
eb60: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
eb70: 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  es of 8-byte ali
eb80: 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  gned bulk memory
eb90: 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f   for pBuf.** fro
eba0: 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70  m the ReusableSp
ebb0: 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ace object.  Ret
ebc0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ebd0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a   the allocated.*
ebe0: 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63  * memory on succ
ebf0: 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ess.  If insuffi
ec00: 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20  cient memory is 
ec10: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
ec20: 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63  .** ReusableSpac
ec30: 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61  e object, increa
ec40: 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  se the ReusableS
ec50: 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20  pace.nNeeded.** 
ec60: 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f  value by the amo
ec70: 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72  unt needed and r
ec80: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
ec90: 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74  * If pBuf is not
eca0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
ecb0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
ecc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20   the memory has 
ecd0: 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
ece0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70  allocated by a p
ecf0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69  rior call to thi
ed00: 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75  s routine, so ju
ed10: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  st return a copy
ed20: 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20  .** of pBuf and 
ed30: 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53 70  leave ReusableSp
ed40: 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ace unchanged..*
ed50: 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61  *.** This alloca
ed60: 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20  tor is employed 
ed70: 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75  to repurpose unu
ed80: 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65  sed slots at the
ed90: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f   end of the.** o
eda0: 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70  pcode array of p
edb0: 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66 6f  repared state fo
edc0: 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e  r other memory n
edd0: 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65 70  eeds of the prep
ede0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
edf0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
ee00: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
ee10: 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
ee20: 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75  Space *p,  /* Bu
ee30: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
ee40: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  ble for allocati
ee50: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
ee60: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
ee70: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
ee80: 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69  a prior allocati
ee90: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  on */.  int nByt
eea0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
eeb0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65    /* Bytes of me
eec0: 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29  mory needed */.)
eed0: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
eee0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
eef0: 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20  (p->pSpace) );. 
ef00: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
ef10: 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
ef20: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  D8(nByte);.    i
ef30: 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e  f( nByte <= p->n
ef40: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Free ){.      p-
ef50: 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b  >nFree -= nByte;
ef60: 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 70  .      pBuf = &p
ef70: 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65  ->pSpace[p->nFre
ef80: 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e];.    }else{. 
ef90: 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20       p->nNeeded 
efa0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a  += nByte;.    }.
efb0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49    }.  assert( EI
efc0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
efd0: 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65  NT(pBuf) );.  re
efe0: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
eff0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
f000: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
f010: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
f020: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
f030: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
f040: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
f050: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
f060: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
f070: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
f080: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
f090: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
f0a0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
f0b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f0c0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
f0d0: 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d  GIC_INIT || p->m
f0e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
f0f0: 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20  _RESET );..  /* 
f100: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
f110: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
f120: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
f130: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
f140: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
f150: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
f160: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
f170: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
f180: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
f190: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
f1a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
f1b0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20  EBUG.  for(i=0; 
f1c0: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
f1d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
f1e0: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
f1f0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
f200: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
f210: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
f220: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
f230: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
f240: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
f250: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
f260: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
f270: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
f280: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
f290: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
f2a0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
f2b0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
f2c0: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
f2d0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
f2e0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
f2f0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
f300: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
f310: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
f320: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
f330: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
f340: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
f350: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
f360: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
f370: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
f380: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
f390: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
f3a0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
f3b0: 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ng registers and
f3c0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
f3d0: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
f3e0: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
f3f0: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
f400: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
f410: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
f420: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
f430: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
f440: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
f450: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
f460: 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c  be called exactl
f470: 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76  y once on each v
f480: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
f490: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
f4a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
f4b0: 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
f4c0: 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69  "packaged" and i
f4d0: 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75  s ready.** to ru
f4e0: 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  n.  After this r
f4f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f500: 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  , further calls 
f510: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
f520: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
f530: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
f540: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
f550: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
f560: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
f570: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
f580: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
f590: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
f5a0: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
f5b0: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
f5c0: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
f5d0: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
f5e0: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
f5f0: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
f600: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
f610: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
f620: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
f630: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f640: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
f650: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
f660: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
f670: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
f680: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
f690: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
f6c0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
f6d0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
f6e0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f6f0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
f700: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f720: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
f730: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
f740: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
f770: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
f780: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
f790: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f7a0: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
f7b0: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
f7c0: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f7e0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
f7f0: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
f800: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
f830: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
f840: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
f850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
f870: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
f880: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
f890: 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a  ace x;        /*
f8a0: 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d   Reusable bulk m
f8b0: 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65  emory */..  asse
f8c0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
f8d0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
f8e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
f8f0: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
f900: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
f910: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
f920: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
f930: 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20  ==p->pParse );. 
f940: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
f950: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
f960: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
f970: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
f980: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
f990: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
f9a0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
f9b0: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
f9c0: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
f9d0: 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72    .  /* Each cur
f9e0: 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72  sor uses a memor
f9f0: 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72  y cell.  The fir
fa00: 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f  st cursor (curso
fa10: 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73  r 0) can.  ** us
fa20: 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20  e aMem[0] which 
fa30: 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  is not otherwise
fa40: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
fa50: 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f  E program.  Allo
fa60: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
fa70: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d  at the end of aM
fa80: 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73  em[] for cursors
fa90: 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a   1 and greater..
faa0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
fab0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
fac0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
fad0: 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e  nCursor;.  if( n
fae0: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65  Cursor==0 && nMe
faf0: 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f  m>0 ) nMem++;  /
fb00: 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d  * Space for aMem
fb10: 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20  [0] even if not 
fb20: 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  used */..  /* Fi
fb30: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
fb40: 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72  h reusable memor
fb50: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  y is available a
fb60: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
fb70: 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  .  ** opcode arr
fb80: 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61 20  ay.  This extra 
fb90: 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72  memory will be r
fba0: 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f  eallocated for o
fbb0: 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20  ther elements.  
fbc0: 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ** of the prepar
fbd0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
fbe0: 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28  */.  n = ROUND8(
fbf0: 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f  sizeof(Op)*p->nO
fc00: 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
fc10: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63   /* Bytes of opc
fc20: 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ode memory used 
fc30: 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20  */.  x.pSpace = 
fc40: 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e  &((u8*)p->aOp)[n
fc50: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
fc60: 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64   /* Unused opcod
fc70: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  e memory */.  as
fc80: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
fc90: 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70  _ALIGNMENT(x.pSp
fca0: 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65  ace) );.  x.nFre
fcb0: 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70  e = ROUNDDOWN8(p
fcc0: 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  Parse->szOpAlloc
fcd0: 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73   - n);  /* Bytes
fce0: 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72   of unused memor
fcf0: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78  y */.  assert( x
fd00: 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61  .nFree>=0 );.  a
fd10: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
fd20: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70  E_ALIGNMENT(&x.p
fd30: 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20  Space[x.nFree]) 
fd40: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
fd50: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
fd60: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
fd70: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
fd80: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
fd90: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
fda0: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
fdb0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
fdc0: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
fdd0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
fde0: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
fdf0: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
fe00: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
fe10: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
fe20: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
fe30: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f  ed in one or two
fe40: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
fe50: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
fe60: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
fe70: 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  e unused memory 
fe80: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
fe90: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
fea0: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
feb0: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
fec0: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
fed0: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
fee0: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
fef0: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
ff00: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
ff10: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
ff20: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d   fill in the rem
ff30: 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66  ainder using a f
ff40: 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  resh memory allo
ff50: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
ff60: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
ff70: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
ff80: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
ff90: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
ffa0: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
ffb0: 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20  leftover memory 
ffc0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ffd0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
ffe0: 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66   This can signif
fff0: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
10000 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
10010 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
10020 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
10030 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
10040 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64   {.    x.nNeeded
10050 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
10060 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  m = allocSpace(&
10070 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  x, p->aMem, nMem
10080 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20  *sizeof(Mem));. 
10090 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
100a0 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
100b0 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
100c0 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61  (Mem));.    p->a
100d0 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
100e0 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20  e(&x, p->apArg, 
100f0 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
10100 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  ));.    p->apCsr
10110 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10120 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  , p->apCsr, nCur
10130 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
10140 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66  ursor*));.#ifdef
10150 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10160 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
10170 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61     p->anExec = a
10180 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
10190 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a  >anExec, p->nOp*
101a0 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
101b0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 78 2e 6e  ndif.    if( x.n
101c0 4e 65 65 64 65 64 3d 3d 30 20 29 20 62 72 65 61  Needed==0 ) brea
101d0 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20  k;.    x.pSpace 
101e0 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c  = p->pFree = sql
101f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
10200 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29  N(db, x.nNeeded)
10210 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20  ;.    x.nFree = 
10220 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77 68  x.nNeeded;.  }wh
10230 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ile( !db->malloc
10240 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e  Failed );..  p->
10250 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d  pVList = pParse-
10260 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73  >pVList;.  pPars
10270 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a  e->pVList =  0;.
10280 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
10290 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
102a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
102b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
102c0 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70  >nVar = 0;.    p
102d0 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->nCursor = 0;. 
102e0 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a     p->nMem = 0;.
102f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
10300 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
10310 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  r;.    p->nVar =
10320 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
10330 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70    initMemArray(p
10340 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62  ->aVar, nVar, db
10350 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
10360 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
10370 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
10380 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c  y(p->aMem, nMem,
10390 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e   db, MEM_Undefin
103a0 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ed);.    memset(
103b0 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75  p->apCsr, 0, nCu
103c0 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
103d0 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
103e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
103f0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
10400 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e      memset(p->an
10410 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a  Exec, 0, p->nOp*
10420 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
10430 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
10440 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
10450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10460 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
10470 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
10480 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
10490 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
104a0 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
104b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
104c0 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
104d0 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
104e0 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
104f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10500 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10510 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20  pCx->pBtx==0 || 
10520 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  pCx->eCurType==C
10530 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
10540 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65    switch( pCx->e
10550 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63  CurType ){.    c
10560 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54  ase CURTYPE_SORT
10570 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
10580 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
10590 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
105a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
105b0 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54   }.    case CURT
105c0 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20  YPE_BTREE: {.   
105d0 20 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70     if( pCx->isEp
105e0 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20  hemeral ){.     
105f0 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78     if( pCx->pBtx
10600 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   ) sqlite3BtreeC
10610 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b  lose(pCx->pBtx);
10620 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
10630 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
10640 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
10650 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
10660 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20  exists, by.     
10670 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
10680 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  bove. */.      }
10690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
106a0 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43  sert( pCx->uc.pC
106b0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
106c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
106d0 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
106e0 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
106f0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
10700 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
10710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10720 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
10730 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a  se CURTYPE_VTAB:
10740 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
10750 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
10760 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56  Cur = pCx->uc.pV
10770 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Cur;.      const
10780 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
10790 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72  *pModule = pVCur
107a0 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
107b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
107c0 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
107d0 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56  ef>0 );.      pV
107e0 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
107f0 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c  --;.      pModul
10800 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
10810 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10820 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
10830 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10840 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ll cursors in th
10850 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
10860 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10870 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
10880 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ame(Vdbe *p){.  
10890 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
108a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
108b0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
108c0 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
108d0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
108e0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
108f0 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
10900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10910 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
10920 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
10930 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
10940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
10960 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
10970 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
10980 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
10990 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
109a0 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
109b0 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
109c0 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
109d0 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
109e0 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
109f0 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
10a00 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
10a10 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
10a20 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
10a30 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
10a40 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
10a50 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
10a60 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65  nFrame(v);.#ifde
10a70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10a80 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
10a90 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46    v->anExec = pF
10aa0 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65  rame->anExec;.#e
10ab0 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  ndif.  v->aOp = 
10ac0 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
10ad0 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
10ae0 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
10af0 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
10b00 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
10b10 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
10b20 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
10b30 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
10b40 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
10b50 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
10b60 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
10b70 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
10b80 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
10b90 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76  me->nChange;.  v
10ba0 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  ->db->nChange = 
10bb0 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67  pFrame->nDbChang
10bc0 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
10bd0 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d  DeleteAuxData(v-
10be0 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74  >db, &v->pAuxDat
10bf0 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e  a, -1, 0);.  v->
10c00 70 41 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d  pAuxData = pFram
10c10 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70  e->pAuxData;.  p
10c20 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20  Frame->pAuxData 
10c30 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  = 0;.  return pF
10c40 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
10c50 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
10c60 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
10c70 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
10c80 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
10c90 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
10ca0 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
10cb0 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
10cc0 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
10cd0 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
10ce0 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
10cf0 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
10d00 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
10d10 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
10d20 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
10d30 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
10d40 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
10d50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10d60 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
10d70 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
10d80 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
10d90 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
10da0 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
10db0 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
10dc0 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
10dd0 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
10de0 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
10df0 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
10e00 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
10e10 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30     p->pFrame = 0
10e20 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20  ;.    p->nFrame 
10e30 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
10e40 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20  t( p->nFrame==0 
10e50 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  );.  closeCursor
10e60 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69  sInFrame(p);.  i
10e70 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
10e80 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
10e90 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d  y(p->aMem, p->nM
10ea0 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
10eb0 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
10ec0 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
10ed0 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
10ee0 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
10ef0 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
10f00 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
10f10 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
10f20 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
10f30 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
10f40 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
10f50 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
10f60 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41  M */.  if( p->pA
10f70 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33  uxData ) sqlite3
10f80 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
10f90 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  a(p->db, &p->pAu
10fa0 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
10fb0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78   assert( p->pAux
10fc0 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Data==0 );.}../*
10fd0 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
10fe0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
10ff0 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
11000 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
11010 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
11020 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
11030 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
11040 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
11050 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
11060 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
11070 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
11080 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
11090 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
110a0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
110b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
110c0 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
110d0 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
110e0 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
110f0 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
11100 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69  nResColumn){.  i
11110 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
11120 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
11130 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  if( p->nResColum
11140 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  n ){.    release
11150 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
11160 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
11170 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
11180 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11190 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
111a0 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52  e);.  }.  n = nR
111b0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
111c0 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
111d0 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
111e0 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
111f0 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
11200 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
11210 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  N(db, sizeof(Mem
11220 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
11230 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
11240 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41  turn;.  initMemA
11250 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
11260 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  , n, db, MEM_Nul
11270 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  l);.}../*.** Set
11280 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11290 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
112a0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
112b0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
112c0 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
112d0 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
112e0 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
112f0 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
11300 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
11310 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
11320 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
11330 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
11340 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
11350 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
11360 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
11370 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
11380 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
11390 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
113a0 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
113b0 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
113c0 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
113d0 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
113e0 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
113f0 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
11400 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
11410 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
11420 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11430 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
11440 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
11470 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
11480 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
114b0 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
114c0 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
114d0 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114f0 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
11500 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
11510 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11520 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
11530 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11540 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
11550 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
11560 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
11570 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
11580 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
11590 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
115a0 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
115b0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
115c0 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
115d0 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
115e0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
115f0 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
11600 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
11610 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11620 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
11630 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
11640 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
11650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11660 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
11670 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
11680 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
11690 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
116a0 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
116b0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
116c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
116d0 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
116e0 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
116f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
11700 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
11710 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
11720 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
11730 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
11740 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
11750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
11760 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
11770 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
11780 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
11790 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
117a0 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
117b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
117c0 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
117d0 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
117e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
117f0 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
11800 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
11810 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
11820 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
11830 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
11840 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
11850 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
11860 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
11870 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
11880 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
11890 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
118a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
118b0 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
118c0 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
118d0 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  saction.        
118e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
118f0 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65  at are candidate
11900 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73  s for a two-phas
11910 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61  e commit using a
11920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11930 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
11940 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72  urnal */.  int r
11950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11960 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
11970 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
11980 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11990 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
119a0 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
119b0 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
119c0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
119d0 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
119e0 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
119f0 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
11a00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11a10 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
11a20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
11a30 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
11a40 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
11a50 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
11a60 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
11a70 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
11a80 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
11a90 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
11aa0 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
11ab0 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
11ac0 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
11ad0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11ae0 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
11af0 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
11b00 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
11b10 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
11b20 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
11b30 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
11b40 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
11b50 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
11b60 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
11b70 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
11b80 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
11b90 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
11ba0 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
11bb0 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
11bc0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
11bd0 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
11be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
11bf0 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
11c00 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
11c10 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
11c20 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
11c30 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
11c40 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
11c50 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
11c60 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
11c70 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
11c80 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
11c90 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
11ca0 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
11cb0 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
11cc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11cd0 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
11ce0 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
11cf0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11d00 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
11d10 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
11d20 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
11d30 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   /* Whether or n
11d40 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69  ot a database mi
11d50 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65  ght need a maste
11d60 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64  r journal depend
11d70 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  s upon.      ** 
11d80 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  its journal mode
11d90 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68   (among other th
11da0 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74  ings).  This mat
11db0 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77  rix determines w
11dc0 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  hich.      ** jo
11dd0 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20  urnal modes use 
11de0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11df0 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f   and which do no
11e00 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  t */.      stati
11e10 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65  c const u8 aMJNe
11e20 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  eded[] = {.     
11e30 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a     /* DELETE   *
11e40 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  /  1,.        /*
11e50 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c   PERSIST   */ 1,
11e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20  .        /* OFF 
11e70 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
11e80 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20      /* TRUNCATE 
11e90 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
11ea0 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30  * MEMORY    */ 0
11eb0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ,.        /* WAL
11ec0 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20         */ 0.    
11ed0 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72    };.      Pager
11ee0 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50   *pPager;   /* P
11ef0 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
11f00 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20  with pBt */.    
11f10 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
11f20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
11f30 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
11f40 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
11f50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
11f60 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  r(pBt);.      if
11f70 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66  ( db->aDb[i].saf
11f80 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52  ety_level!=PAGER
11f90 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
11fa0 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65  .       && aMJNe
11fb0 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65  eded[sqlite3Page
11fc0 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
11fd0 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 20  pPager)].       
11fe0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
11ff0 73 4d 65 6d 64 62 28 70 50 61 67 65 72 29 3d 3d  sMemdb(pPager)==
12000 30 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20  0.      ){ .    
12010 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31      assert( i!=1
12020 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61   );.        nTra
12030 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns++;.      }.  
12040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12050 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
12060 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12070 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12080 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
12090 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
120a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
120b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
120c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
120d0 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
120e0 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
120f0 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
12100 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
12110 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
12120 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12130 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
12140 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12150 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
12160 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
12170 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12180 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12190 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
121a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
121b0 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
121c0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
121d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
121e0 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
121f0 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
12200 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
12210 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
12220 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
12230 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
12240 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
12250 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
12260 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
12270 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
12280 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
12290 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
122a0 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
122b0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
122c0 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
122d0 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
122e0 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
122f0 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
12300 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
12310 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
12320 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
12330 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
12340 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
12350 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
12360 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
12370 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
12380 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
12390 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
123a0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
123b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
123c0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
123d0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
123e0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
123f0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
12400 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
12410 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
12420 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
12430 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12440 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
12450 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
12460 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
12470 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
12480 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
12490 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
124a0 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
124b0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
124c0 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
124d0 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
124e0 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
124f0 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
12500 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
12510 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
12520 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
12530 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
12540 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
12550 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
12560 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
12570 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
12580 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
12590 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
125a0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
125b0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
125c0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
125d0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
125e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
125f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12600 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
12610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12620 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12640 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
12650 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
12660 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
12670 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
12680 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
12690 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
126a0 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
126b0 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
126c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
126d0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
126e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
126f0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
12700 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
12710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12720 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
12730 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
12740 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
12750 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  s;.    char *zMa
12760 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
12770 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
12780 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12790 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
127a0 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
127b0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
127c0 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
127d0 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
127e0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
127f0 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
12800 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
12810 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
12820 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
12830 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
12840 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
12850 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
12860 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
12870 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
12880 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12890 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
128a0 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
128b0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
128c0 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
128d0 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
128e0 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
128f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12900 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64  OMEM_BKPT;.    d
12910 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
12920 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
12930 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
12940 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
12950 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
12960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
12970 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
12980 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
12990 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
129a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
129b0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
129c0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
129d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
129e0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
129f0 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
12a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
12a10 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
12a20 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
12a30 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
12a40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12a50 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
12a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
12a70 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
12a80 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
12a90 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
12aa0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
12ab0 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
12ac0 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
12ad0 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
12b00 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
12b10 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
12b20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
12b30 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
12b40 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
12b50 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
12b60 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
12b70 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
12b80 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
12b90 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
12ba0 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
12bb0 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
12bc0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
12bd0 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
12be0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
12bf0 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
12c00 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
12c10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12c20 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12c30 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
12c40 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12c50 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
12c60 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
12c70 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
12c80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12c90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
12ca0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
12cb0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
12cc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
12cd0 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
12ce0 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
12cf0 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
12d00 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
12d10 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
12d20 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
12d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
12d40 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
12d50 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
12d60 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
12d70 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
12d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12d90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12da0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12db0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12dc0 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
12dd0 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
12de0 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
12df0 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
12e00 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
12e10 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
12e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
12e30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12e40 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
12e50 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
12e60 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
12e70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
12e80 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
12e90 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
12ea0 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
12eb0 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
12ec0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12ed0 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
12ee0 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
12ef0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
12f00 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
12f10 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
12f20 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
12f30 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
12f40 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
12f50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
12f60 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
12f70 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
12f80 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
12f90 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
12fa0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
12fb0 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
12fc0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
12fd0 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
12fe0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
12ff0 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
13000 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
13010 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
13020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13030 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
13040 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
13050 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
13060 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
13070 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
13080 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
13090 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
130a0 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
130b0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
130c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
130d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
130e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
130f0 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
13100 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
13110 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13120 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
13130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13140 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
13150 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
13160 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13180 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
13190 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
131a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
131b0 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
131c0 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
131d0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
131e0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
131f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
13200 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  f( 0==(sqlite3Os
13210 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
13220 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
13230 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
13240 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
13250 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
13260 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
13270 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
13280 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
13290 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
132a0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
132b0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
132c0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
132d0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
132e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
132f0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
13300 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
13310 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
13320 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
13330 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
13340 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
13350 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
13360 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
13370 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13380 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
13390 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
133a0 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
133b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
133c0 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
133d0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
133e0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
133f0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
13400 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13410 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
13420 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
13430 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13440 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
13450 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
13460 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
13470 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
13480 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
13490 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
134a0 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
134b0 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
134c0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
134d0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
134e0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
134f0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
13500 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
13510 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
13520 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
13530 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
13540 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
13550 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
13560 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
13570 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
13580 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
13590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
135a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
135b0 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
135c0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
135d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
135e0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
135f0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
13600 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
13610 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
13620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13630 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13640 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
13650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
13670 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
13680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
13690 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
136a0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
136b0 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
136c0 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
136d0 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
136e0 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
136f0 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
13700 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
13710 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
13720 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
13730 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
13740 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
13750 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
13760 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
13770 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
13780 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
13790 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
137a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
137b0 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
137c0 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
137d0 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
137e0 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
137f0 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
13800 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
13810 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
13820 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
13830 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
13840 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
13850 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
13860 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
13870 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
13880 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
13890 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
138a0 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
138b0 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
138c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
138d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
138e0 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
138f0 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
13900 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
13910 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
13920 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
13930 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
13940 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
13950 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
13960 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
13970 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
13980 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
13990 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
139a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
139b0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
139c0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
139d0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
139e0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
139f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13a00 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
13a10 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
13a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13a30 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
13a40 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
13a50 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
13a60 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
13a70 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
13a80 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
13a90 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
13aa0 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
13ab0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
13ac0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
13ad0 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
13ae0 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
13af0 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
13b00 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
13b10 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
13b20 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
13b30 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
13b40 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
13b50 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
13b60 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
13b70 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
13b80 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
13b90 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
13ba0 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
13bb0 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
13bc0 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
13bd0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
13be0 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
13bf0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
13c00 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
13c10 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
13c20 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
13c30 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
13c40 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
13c50 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
13c60 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
13c70 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
13c80 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
13c90 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
13ca0 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
13cb0 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
13cc0 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
13cd0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
13ce0 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
13cf0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
13d00 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
13d10 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
13d20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
13d30 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
13d40 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
13d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
13d60 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
13d70 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
13d80 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
13d90 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
13da0 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
13db0 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
13dc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
13dd0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
13de0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
13df0 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
13e00 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
13e10 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
13e20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
13e30 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
13e40 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
13e50 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
13e60 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
13e70 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
13e80 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
13e90 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
13ea0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
13eb0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
13ec0 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
13ed0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
13ee0 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
13ef0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
13f00 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
13f10 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
13f20 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
13f30 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
13f40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13f50 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
13f60 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
13f70 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
13f80 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62  NOINLINE int vdb
13f90 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
13fa0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
13fb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
13fc0 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
13fd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13fe0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
13ff0 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
14000 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
14010 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65  ement-1;..  asse
14020 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
14030 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
14040 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
14050 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
14060 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
14070 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
14080 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
14090 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
140a0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
140b0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
140c0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
140d0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
140e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72  LITE_OK;.    Btr
140f0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
14100 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
14110 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69  ( pBt ){.      i
14120 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
14130 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
14140 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
14150 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
14160 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
14170 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
14180 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
14190 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
141a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
141b0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
141c0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
141d0 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
141e0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
141f0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
14200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14220 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
14230 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  }.    }.  }.  db
14240 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
14250 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
14260 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  = 0;..  if( rc==
14270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14280 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
14290 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
142a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
142b0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
142c0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
142d0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
142e0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
142f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14300 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
14310 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
14320 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
14330 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
14340 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
14350 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  }..  /* If the s
14360 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14370 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
14380 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
14390 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a  restore the .  *
143a0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
143b0 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
143c0 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
143d0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
143e0 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68  ad when .  ** th
143f0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
14400 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
14410 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f  ed.  */.  if( eO
14420 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
14430 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d  LBACK ){.    db-
14440 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14450 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
14460 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  ;.    db->nDefer
14470 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
14480 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
14490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
144a0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
144b0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
144c0 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
144d0 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  Op){.  if( p->db
144e0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
144f0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
14500 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65  .    return vdbe
14510 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
14520 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  , eOp);.  }.  re
14530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14540 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
14550 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14560 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
14570 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
14580 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
14590 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
145a0 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
145b0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
145c0 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
145d0 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
145e0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
145f0 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
14600 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
14610 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
14620 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
14630 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
14640 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
14650 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
14660 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
14670 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
14680 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
14690 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
146a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
146b0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
146c0 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
146d0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
146e0 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
146f0 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
14700 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
14710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14720 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
14730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
14740 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
14750 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
14760 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
14770 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
14780 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
14790 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
147a0 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
147b0 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
147c0 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
147d0 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
147e0 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
147f0 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
14800 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
14810 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
14820 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
14830 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
14840 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
14850 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
14860 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
14870 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
14880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14890 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
148a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
148b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
148c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
148d0 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
148e0 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
148f0 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
14900 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
14910 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
14920 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
14930 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
14940 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
14950 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
14960 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
14970 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
14980 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14990 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
149a0 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
149b0 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
149c0 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
149d0 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
149e0 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
149f0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
14a00 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
14a10 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
14a20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
14a30 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
14a40 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
14a50 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
14a60 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
14a70 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
14a80 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
14a90 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
14aa0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
14ab0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
14ac0 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
14ad0 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
14ae0 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
14af0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
14b00 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
14b10 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
14b20 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
14b30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14b50 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
14b60 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
14b70 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
14b80 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
14b90 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
14ba0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
14bb0 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
14bc0 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
14bd0 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
14be0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
14bf0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
14c00 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
14c10 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
14c20 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
14c30 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
14c40 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
14c50 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
14c60 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
14c70 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
14c80 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
14c90 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
14ca0 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
14cb0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
14cc0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
14cd0 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
14ce0 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
14cf0 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
14d00 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
14d10 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
14d20 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
14d30 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
14d40 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
14d50 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
14d60 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
14d70 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
14d80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
14d90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
14da0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14db0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
14dc0 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
14dd0 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
14de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
14e00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14e10 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14e20 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
14e30 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
14e40 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b  sors(p);.  check
14e50 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
14e60 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
14e70 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
14e80 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
14e90 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
14ea0 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
14eb0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
14ec0 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
14ed0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
14ee0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
14ef0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
14f00 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
14f10 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
14f20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
14f30 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
14f40 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
14f50 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
14f60 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
14f70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
14f80 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
14f90 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
14fa0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
14fb0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
14fc0 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
14fd0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
14fe0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
14ff0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
15000 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
15010 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
15020 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
15030 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
15040 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
15050 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
15060 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
15070 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
15080 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
15090 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
150a0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
150b0 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
150c0 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
150d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
150e0 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
150f0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
15100 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
15110 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
15120 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
15130 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
15140 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
15150 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
15160 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
15170 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
15180 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
15190 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
151a0 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
151b0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
151c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
151d0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
151e0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
151f0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
15200 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
15210 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
15220 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
15230 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
15240 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
15250 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
15260 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
15270 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
15280 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
15290 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
152a0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
152b0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
152c0 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
152d0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
152e0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
152f0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
15300 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
15310 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
15320 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
15330 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
15340 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
15350 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
15360 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
15370 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
15380 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
15390 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
153a0 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
153b0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
153c0 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
153d0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
153e0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
153f0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
15400 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
15410 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15420 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
15430 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
15440 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
15450 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
15460 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
15470 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
15480 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
15490 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
154a0 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
154b0 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
154c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
154d0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
154e0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
154f0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
15500 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15510 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15520 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15530 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
15540 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
15550 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
15560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15570 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
15580 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
15590 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
155a0 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
155b0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
155c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
155d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
155e0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
155f0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
15600 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
15610 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
15620 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
15630 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
15640 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
15650 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
15660 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
15670 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
15680 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
15690 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
156a0 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
156b0 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
156c0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
156d0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
156e0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
156f0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
15700 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
15710 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
15720 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
15730 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
15740 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
15750 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
15760 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
15770 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15780 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
15790 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
157a0 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
157b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
157c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
157d0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
157e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
157f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15800 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
15810 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
15820 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15830 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
15840 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
15850 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
15860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15870 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15880 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
15890 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
158a0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
158b0 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
158c0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
158d0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
158e0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
158f0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
15900 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
15910 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
15920 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
15930 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
15940 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
15950 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
15960 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
15970 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
15980 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
15990 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
159a0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
159b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
159c0 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
159d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
159e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
159f0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
15a00 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
15a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
15a20 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
15a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
15a40 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
15a50 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
15a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15a70 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
15a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15a90 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
15aa0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
15ab0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
15ac0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
15ad0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
15ae0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
15af0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
15b00 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
15b10 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
15b20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
15b30 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
15b40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15b50 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
15b60 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
15b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15b80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
15b90 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
15ba0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
15bb0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
15bc0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
15bd0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
15be0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
15bf0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
15c00 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
15c10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15c20 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
15c30 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
15c40 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
15c50 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
15c60 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
15c70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
15c80 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
15c90 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
15ca0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
15cb0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
15cc0 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
15cd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15ce0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
15cf0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
15d00 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
15d10 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
15d20 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
15d30 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
15d40 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
15d50 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
15d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15d70 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
15d80 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
15d90 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
15da0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
15db0 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
15dc0 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
15dd0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
15de0 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
15df0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
15e00 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
15e10 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
15e20 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
15e30 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
15e40 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
15e50 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
15e60 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
15e70 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
15e80 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
15e90 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
15ea0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
15eb0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
15ec0 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
15ed0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
15ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
15ef0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
15f00 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
15f10 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
15f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
15f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
15f40 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
15f50 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
15f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
15f70 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
15f80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15f90 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
15fb0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
15fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
15fd0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
15fe0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
15ff0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
16000 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
16010 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
16020 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
16030 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
16040 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
16050 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16060 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
16070 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
16080 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
16090 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
160a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
160b0 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
160c0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
160d0 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
160e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
160f0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
16100 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
16110 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
16120 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
16130 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
16140 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
16150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16160 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
16170 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
16180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
161a0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
161b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
161c0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
161d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
161e0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
161f0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
16200 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a  eLeave(p);.  }..
16210 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
16220 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
16230 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
16240 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
16250 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
16260 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
16270 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d  db->nVdbeActive-
16280 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
16290 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56  eadOnly ) db->nV
162a0 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20  dbeWrite--;.    
162b0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
162c0 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64   ) db->nVdbeRead
162d0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
162e0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
162f0 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
16300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
16310 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d  ->nVdbeRead>=db-
16320 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
16330 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
16340 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a  VdbeWrite>=0 );.
16350 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
16360 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
16370 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
16380 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
16390 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
163a0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
163b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
163c0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
163d0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
163e0 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
163f0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
16400 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
16410 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
16420 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
16430 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
16440 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
16450 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
16460 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
16470 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
16480 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
16490 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
164a0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
164b0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
164c0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
164d0 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
164e0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
164f0 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62  beActive>0 || db
16500 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
16510 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  || db->nStatemen
16520 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
16530 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
16540 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55  BUSY ? SQLITE_BU
16550 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  SY : SQLITE_OK);
16560 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
16570 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
16580 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
16590 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
165a0 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
165b0 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
165c0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
165d0 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
165e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
165f0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
16600 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
16610 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
16620 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
16630 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
16640 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
16650 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c  rror message bel
16660 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44  onging to the VD
16670 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  BE passed.** as 
16680 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16690 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61  nt to its databa
166a0 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68  se handle (so th
166b0 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
166c0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
166d0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
166e0 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
166f0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29  qlite3_errmsg())
16700 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
16710 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
16720 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72  lear the VDBE er
16730 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73  ror code or mess
16740 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70  age, just.** cop
16750 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ies them to the 
16760 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
16770 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16780 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
16790 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
167a0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
167b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
167c0 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72  rc;.  if( p->zEr
167d0 72 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e  rMsg ){.    db->
167e0 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b  bBenignMalloc++;
167f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
16800 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
16810 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72  .    if( db->pEr
16820 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20  r==0 ) db->pErr 
16830 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
16840 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
16850 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
16860 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
16870 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
16880 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
16890 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
168a0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
168b0 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42  oc();.    db->bB
168c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20  enignMalloc--;. 
168d0 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 70   }else if( db->p
168e0 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
168f0 65 33 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64  e3ValueSetNull(d
16900 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20  b->pErr);.  }.  
16910 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
16920 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16930 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16940 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
16950 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
16960 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
16970 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
16980 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
16990 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
169a0 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
169b0 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
169c0 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
169d0 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
169e0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
169f0 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
16a00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
16a10 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
16a20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
16a30 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
16a40 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
16a50 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
16a60 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
16a70 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
16a80 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
16a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16aa0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
16ab0 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
16ac0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16ad0 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
16ae0 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
16af0 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
16b00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16b10 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
16b20 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
16b30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16b40 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
16b50 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
16b60 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
16b70 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
16b80 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
16b90 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
16ba0 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
16bb0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
16bc0 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
16bd0 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
16be0 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
16bf0 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
16c00 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
16c10 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
16c20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
16c30 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
16c40 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
16c50 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
16c60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
16c70 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
16c80 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
16c90 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
16ca0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
16cb0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
16cc0 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
16cd0 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
16ce0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
16cf0 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  et(Vdbe *p){.#if
16d00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
16d10 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
16d20 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
16d30 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
16d40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16d50 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
16d60 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
16d70 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
16d80 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
16d90 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
16da0 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
16db0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
16dc0 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
16dd0 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
16de0 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
16df0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
16e00 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
16e10 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
16e20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
16e30 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
16e40 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
16e50 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
16e60 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
16e70 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
16e80 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
16e90 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
16ea0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
16eb0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
16ec0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
16ed0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
16ee0 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
16ef0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
16f00 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
16f10 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
16f20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
16f30 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
16f40 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
16f50 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
16f60 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
16f70 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
16f80 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 69 66 28  rror(p);.    if(
16f90 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
16fa0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
16fb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
16fc0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
16fd0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
16fe0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
16ff0 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
17000 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
17010 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
17020 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
17030 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
17040 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
17050 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
17060 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
17070 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
17080 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
17090 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
170a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
170b0 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63  ithMsg(db, p->rc
170c0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
170d0 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
170e0 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Msg);.  }..  /* 
170f0 52 65 73 65 74 20 72 65 67 69 73 74 65 72 20 63  Reset register c
17100 6f 6e 74 65 6e 74 73 20 61 6e 64 20 72 65 63 6c  ontents and recl
17110 61 69 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67  aim error messag
17120 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23  e memory..  */.#
17130 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
17140 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
17150 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
17160 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
17170 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
17180 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
17190 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
171a0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
171b0 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
171c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  */.  if( p->apCs
171d0 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  r ) for(i=0; i<p
171e0 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
171f0 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
17200 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]==0 );.  if( 
17210 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66  p->aMem ){.    f
17220 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=0; i<p->nMe
17230 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
17240 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
17250 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
17260 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17270 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17280 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
17290 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
172a0 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
172b0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
172c0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e  ITE_DEBUG.  p->n
172d0 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
172e0 66 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  f..  /* Save pro
172f0 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
17300 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
17310 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
17320 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
17330 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
17340 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
17350 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
17360 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
17370 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
17380 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
17390 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
173a0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
173b0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
173c0 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
173d0 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
173e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
173f0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
17400 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
17410 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
17420 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
17430 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
17440 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
17450 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
17460 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
17470 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
17480 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
17490 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
174a0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
174b0 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
174c0 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
174d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
174e0 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
174f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
17500 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
17510 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
17520 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
17530 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
17540 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
17550 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
17560 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
17570 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
17580 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
17590 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
175a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
175b0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
175c0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
175d0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
175e0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
175f0 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
17600 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
17610 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
17620 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
17630 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
17640 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
17650 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
17660 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
17670 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
17680 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
17690 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53  = VDBE_MAGIC_RES
176a0 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  ET;.  return p->
176b0 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
176c0 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
176d0 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
176e0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
176f0 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
17700 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
17710 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
17720 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
17730 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
17740 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
17750 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
17760 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
17770 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
17780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17790 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
177a0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
177b0 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
177c0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
177d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
177e0 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
177f0 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
17800 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
17810 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
17820 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
17830 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17840 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
17850 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
17860 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
17870 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
17880 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
17890 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
178a0 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
178b0 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
178c0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
178d0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
178e0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
178f0 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
17900 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
17910 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
17920 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
17930 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
17940 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
17950 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
17960 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
17970 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
17980 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
17990 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
179a0 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
179b0 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
179c0 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
179d0 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
179e0 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
179f0 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
17a00 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
17a10 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
17a20 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
17a30 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
17a40 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
17a50 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
17a60 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
17a70 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
17a80 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
17a90 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
17aa0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
17ab0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69  orresponds to bi
17ac0 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
17ad0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
17ae0 6c 65 74 65 41 75 78 44 61 74 61 28 73 71 6c 69  leteAuxData(sqli
17af0 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61  te3 *db, AuxData
17b00 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20   **pp, int iOp, 
17b10 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69  int mask){.  whi
17b20 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41  le( *pp ){.    A
17b30 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a  uxData *pAux = *
17b40 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70  pp;.    if( (iOp
17b50 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75  <0).     || (pAu
17b60 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20  x->iAuxOp==iOp. 
17b70 20 20 20 20 20 20 20 20 20 26 26 20 70 41 75 78           && pAux
17b80 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20 20 20  ->iAuxArg>=0.   
17b90 20 20 20 20 20 20 20 26 26 20 28 70 41 75 78 2d         && (pAux-
17ba0 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c 20 21  >iAuxArg>31 || !
17bb0 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
17bc0 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 29  2(pAux->iAuxArg)
17bd0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
17be0 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
17bf0 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a  >iAuxArg==31 );.
17c00 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
17c10 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a 20 20  xDeleteAux ){.  
17c20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
17c30 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70 41 75  eteAux(pAux->pAu
17c40 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
17c50 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
17c60 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20 73 71  extAux;.      sq
17c70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17c80 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
17c90 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
17ca0 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20  x->pNextAux;.   
17cb0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17cc0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
17cd0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17ce0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
17cf0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
17d00 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70  gument,.** excep
17d10 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73  t for object its
17d20 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72  elf, which is pr
17d30 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eserved..**.** T
17d40 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
17d50 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
17d60 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
17d70 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
17d80 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
17d90 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
17da0 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
17db0 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
17dc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
17dd0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
17de0 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72  onnection and fr
17df0 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ees the object i
17e00 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tself..*/.void s
17e10 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
17e20 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
17e30 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
17e40 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
17e50 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72   *pNext;.  asser
17e60 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
17e70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
17e80 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
17e90 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
17ea0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
17eb0 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
17ec0 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
17ed0 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
17ee0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
17ef0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
17f00 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
17f10 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
17f20 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
17f30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
17f40 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ub);.  }.  if( p
17f50 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
17f60 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
17f70 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
17f80 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
17f90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
17fa0 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69  Free(db, p->pVLi
17fb0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
17fc0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
17fd0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65  ree);.  }.  vdbe
17fe0 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
17ff0 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
18000 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18010 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
18020 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
18030 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
18040 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18050 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
18060 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e  TATUS.  {.    in
18070 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
18080 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
18090 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
180a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
180b0 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
180c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
180d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
180e0 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Scan);.  }.#endi
180f0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
18100 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
18110 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18120 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
18130 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
18140 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *db;..  assert( 
18150 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
18160 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
18170 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18180 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
18190 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
181a0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
181b0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
181c0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
181d0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
181e0 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
181f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
18200 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
18210 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
18220 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
18230 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
18240 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
18250 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
18260 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
18270 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
18280 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
18290 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
182a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
182b0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
182c0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
182d0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
182e0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
182f0 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
18300 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
18310 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
18320 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
18330 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
18340 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
18350 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
18360 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
18370 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
18380 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
18390 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
183a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
183b0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
183c0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
183d0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
183e0 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
183f0 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
18400 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
18410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
18420 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
18430 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
18440 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
18450 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
18460 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
18470 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
18480 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
18490 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
184a0 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
184b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
184c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
184d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
184e0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
184f0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
18500 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
18510 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
18520 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
18530 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
18540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18550 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
18560 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
18570 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
18580 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
18590 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
185a0 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
185b0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
185c0 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
185d0 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
185e0 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
185f0 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
18600 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
18610 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
18620 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
18630 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
18640 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
18650 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
18660 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
18670 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
18680 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
18690 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
186a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
186b0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
186c0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
186d0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
186e0 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
186f0 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
18700 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
18710 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
18720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18730 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
18740 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18750 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
18760 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
18770 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
18780 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18790 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
187a0 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
187b0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
187c0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
187d0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
187e0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
187f0 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
18800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18810 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
18820 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
18830 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
18840 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
18850 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
18860 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
18870 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
18880 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
18890 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
188a0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
188b0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
188c0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
188d0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
188e0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
188f0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
18900 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
18910 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
18920 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
18930 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
18940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18950 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18960 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
18970 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
18980 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
18990 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
189a0 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
189b0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
189c0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
189d0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
189e0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
189f0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
18a00 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
18a10 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
18a20 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
18a30 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
18a40 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
18a50 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
18a60 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
18a70 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
18a80 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
18a90 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
18aa0 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
18ab0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
18ac0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
18ad0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
18ae0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
18af0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
18b00 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
18b10 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
18b20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
18b30 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
18b40 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
18b50 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
18b60 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
18b70 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
18b80 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
18b90 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
18ba0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18bb0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
18bc0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
18bd0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
18be0 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
18bf0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
18c00 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74   = *pp;.  assert
18c10 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
18c20 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20  URTYPE_BTREE || 
18c30 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
18c40 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20  TYPE_PSEUDO );. 
18c50 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
18c60 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
18c70 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20  t iMap;.    if( 
18c80 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69  p->aAltMap && (i
18c90 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70  Map = p->aAltMap
18ca0 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b  [1+*piCol])>0 ){
18cb0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
18cc0 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  pAltCursor;.    
18cd0 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20    *piCol = iMap 
18ce0 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  - 1;.      retur
18cf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18d00 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61   }.    return ha
18d10 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
18d20 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  to(p);.  }.  if(
18d30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
18d40 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
18d50 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
18d60 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
18d70 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
18d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18d90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18da0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
18db0 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
18dc0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18dd0 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
18de0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18df0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
18e00 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
18e10 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
18e20 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
18e30 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18e40 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
18e50 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
18e60 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
18e70 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
18e80 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
18e90 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
18ea0 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
18eb0 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
18ec0 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
18ed0 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
18ee0 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
18ef0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
18f00 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
18f10 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
18f20 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
18f30 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
18f40 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
18f50 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
18f60 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
18f70 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
18f80 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
18f90 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
18fa0 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
18fb0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
18fc0 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
18fd0 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
18fe0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
18ff0 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
19000 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
19010 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
19020 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
19030 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
19040 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
19050 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
19060 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
19070 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a   separately..**.
19080 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19090 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
190a0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
190b0 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
190c0 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
190d0 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
190e0 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
190f0 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
19100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
19110 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
19120 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
19130 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19160 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
19190 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
191a0 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
191c0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
191d0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
191e0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
191f0 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
19200 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
19210 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
19240 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19250 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
19260 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
19270 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
19280 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192a0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
192b0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
192c0 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
192e0 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
192f0 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
19320 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
19330 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19360 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
19370 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
193a0 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
193b0 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
193c0 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
193d0 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
193e0 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
193f0 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
19400 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
19410 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
19420 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
19430 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
19440 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
19450 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
19460 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
19470 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
19480 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
19490 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
194a0 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
194b0 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
194c0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
194d0 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
194e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
194f0 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
19500 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33   file_format, u3
19510 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20  2 *pLen){.  int 
19520 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
19530 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
19540 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30   assert( pLen!=0
19550 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26   );.  if( flags&
19560 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
19570 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72  *pLen = 0;.    r
19580 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
19590 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
195a0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
195b0 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
195c0 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
195d0 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
195e0 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
195f0 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
19600 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
19610 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
19620 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
19630 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
19640 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
19650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19660 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
19670 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
19680 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d       if( (i&1)==
19690 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
196a0 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  >=4 ){.        *
196b0 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pLen = 0;.      
196c0 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
196d0 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  u;.      }else{.
196e0 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
196f0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
19700 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
19710 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
19720 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32  767 ){ *pLen = 2
19730 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20  ; return 2; }.  
19740 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
19750 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72   ){ *pLen = 3; r
19760 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69  eturn 3; }.    i
19770 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
19780 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72   ){ *pLen = 4; r
19790 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69  eturn 4; }.    i
197a0 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
197b0 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65  ){ *pLen = 6; re
197c0 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70  turn 5; }.    *p
197d0 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
197e0 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
197f0 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
19800 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
19810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
19820 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
19830 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
19840 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
19850 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
19860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
19870 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
19880 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
19890 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
198a0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
198b0 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
198c0 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
198d0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
198e0 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
198f0 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
19900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  .}../*.** The si
19910 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74  zes for serial t
19920 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ypes less than 1
19930 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  28.*/.static con
19940 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61  st u8 sqlite3Sma
19950 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20  llTypeSizes[] = 
19960 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20  {.        /*  0 
19970 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20    1   2   3   4 
19980 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20    5   6   7   8 
19990 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30    9 */   ./*   0
199a0 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c   */   0,  1,  2,
199b0 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c    3,  4,  6,  8,
199c0 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    8,  0,  0,./* 
199d0 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   10 */   0,  0, 
199e0 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
199f0 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a   2,  2,  3,  3,.
19a00 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20  /*  20 */   4,  
19a10 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20  4,  5,  5,  6,  
19a20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20  6,  7,  7,  8,  
19a30 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39  8,./*  30 */   9
19a40 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31  ,  9, 10, 10, 11
19a50 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33  , 11, 12, 12, 13
19a60 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20  , 13,./*  40 */ 
19a70 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c   14, 14, 15, 15,
19a80 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c   16, 16, 17, 17,
19a90 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20   18, 18,./*  50 
19aa0 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20  */  19, 19, 20, 
19ab0 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20  20, 21, 21, 22, 
19ac0 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20  22, 23, 23,./*  
19ad0 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32  60 */  24, 24, 2
19ae0 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32  5, 25, 26, 26, 2
19af0 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f  7, 27, 28, 28,./
19b00 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39  *  70 */  29, 29
19b10 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31  , 30, 30, 31, 31
19b20 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33  , 32, 32, 33, 33
19b30 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c  ,./*  80 */  34,
19b40 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c   34, 35, 35, 36,
19b50 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c   36, 37, 37, 38,
19b60 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20   38,./*  90 */  
19b70 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20  39, 39, 40, 40, 
19b80 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20  41, 41, 42, 42, 
19b90 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a  43, 43,./* 100 *
19ba0 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34  /  44, 44, 45, 4
19bb0 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34  5, 46, 46, 47, 4
19bc0 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31  7, 48, 48,./* 11
19bd0 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30  0 */  49, 49, 50
19be0 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32  , 50, 51, 51, 52
19bf0 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a  , 52, 53, 53,./*
19c00 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c   120 */  54, 54,
19c10 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c   55, 55, 56, 56,
19c20 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a   57, 57.};../*.*
19c30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
19c40 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
19c50 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
19c60 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
19c70 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
19c80 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
19c90 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
19ca0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
19cb0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
19cc0 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72  128 ){.    retur
19cd0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
19ce0 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
19cf0 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61     assert( seria
19d00 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20  l_type<12 .     
19d10 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
19d20 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
19d30 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73  serial_type]==(s
19d40 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
19d50 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  /2 );.    return
19d60 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
19d70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
19d80 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71  pe];.  }.}.u8 sq
19d90 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65  lite3VdbeOneByte
19da0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38  SerialTypeLen(u8
19db0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
19dc0 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
19dd0 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65  type<128 );.  re
19de0 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
19df0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
19e00 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a  l_type];  .}../*
19e10 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
19e20 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
19e30 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
19e40 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
19e50 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
19e60 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
19e70 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
19e80 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
19e90 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
19ea0 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
19eb0 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
19ec0 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
19ed0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
19ee0 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
19ef0 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
19f00 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
19f10 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
19f20 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
19f30 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
19f40 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
19f50 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
19f60 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
19f70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
19f80 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
19f90 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
19fa0 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
19fb0 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
19fc0 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
19fd0 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
19fe0 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
19ff0 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
1a000 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
1a010 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
1a020 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
1a030 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
1a040 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
1a050 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
1a060 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
1a070 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
1a080 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
1a090 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
1a0a0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
1a0b0 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
1a0c0 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
1a0d0 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
1a0e0 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
1a0f0 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
1a100 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
1a110 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
1a120 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
1a130 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
1a140 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
1a150 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
1a160 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
1a170 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
1a180 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
1a190 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
1a1a0 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
1a1b0 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
1a1c0 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
1a1d0 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
1a1e0 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
1a1f0 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
1a200 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
1a210 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
1a220 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
1a230 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
1a240 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
1a250 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
1a260 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
1a270 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
1a280 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
1a290 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
1a2a0 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
1a2b0 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
1a2c0 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
1a2d0 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
1a2e0 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
1a2f0 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
1a300 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
1a310 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
1a320 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
1a330 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
1a340 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
1a350 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
1a360 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
1a370 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
1a380 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
1a390 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
1a3a0 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
1a3b0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
1a3c0 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
1a3d0 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
1a3e0 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
1a3f0 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
1a400 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
1a410 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
1a420 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
1a430 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
1a440 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
1a450 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
1a460 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
1a470 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
1a480 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
1a490 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
1a4a0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
1a4b0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
1a4c0 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
1a4d0 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
1a4e0 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
1a4f0 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
1a500 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
1a510 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
1a520 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
1a530 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
1a540 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
1a550 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
1a560 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
1a570 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
1a580 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
1a590 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1a5a0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1a5b0 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
1a5c0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
1a5d0 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
1a5e0 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
1a5f0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
1a600 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
1a610 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1a620 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1a630 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
1a640 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
1a650 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1a660 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1a670 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
1a680 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
1a690 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
1a6a0 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  f[].  The caller
1a6b0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a   is responsible.
1a6c0 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e  ** for allocatin
1a6d0 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  g enough space t
1a6e0 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20  o buf[] to hold 
1a6f0 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
1a700 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f  , exclusive.** o
1a710 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  f the pMem->u.nZ
1a720 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20  ero bytes for a 
1a730 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a  MEM_Zero value..
1a740 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1a750 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a760 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
1a770 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
1a780 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1a790 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
1a7a0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
1a7b0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
1a7c0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
1a7d0 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
1a7e0 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
1a7f0 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
1a800 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1a810 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
1a820 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20   Mem *pMem, u32 
1a830 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
1a840 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
1a850 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
1a860 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
1a870 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
1a880 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
1a890 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
1a8a0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
1a8b0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1a8c0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1a8d0 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
1a8e0 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20  ->u.r) );.      
1a8f0 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
1a900 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29  ->u.r, sizeof(v)
1a910 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
1a920 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
1a930 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a940 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
1a950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
1a960 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  = i = sqlite3Sma
1a970 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1a980 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73  al_type];.    as
1a990 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
1a9a0 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
1a9b0 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
1a9c0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
1a9d0 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
1a9e0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
1a9f0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
1aa00 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
1aa10 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1aa20 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
1aa30 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
1aa40 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1aa50 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
1aa60 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
1aa70 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
1aa80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1aa90 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1aaa0 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
1aab0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69  = pMem->n;.    i
1aac0 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70  f( len>0 ) memcp
1aad0 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
1aae0 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
1aaf0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
1ab00 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
1ab10 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
1ab20 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
1ab30 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
1ab40 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
1ab50 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
1ab60 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
1ab70 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1ab80 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
1ab90 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
1aba0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
1abb0 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
1abc0 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
1abd0 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
1abe0 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
1abf0 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
1ac00 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
1ac10 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
1ac20 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
1ac30 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
1ac40 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
1ac50 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1ac60 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
1ac70 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
1ac80 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
1ac90 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65  <<8)|(x)[3]).#de
1aca0 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49  fine FOUR_BYTE_I
1acb0 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a  NT(x) (16777216*
1acc0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
1acd0 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1ace0 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
1acf0 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
1ad00 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
1ad10 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
1ad20 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
1ad30 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
1ad40 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1ad50 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
1ad60 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1ad70 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
1ad80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ad90 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1ada0 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74  d as two separat
1adb0 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  e routines for p
1adc0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
1add0 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61  he few cases tha
1ade0 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20  t require local 
1adf0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72  variables are br
1ae00 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20  oken out into a 
1ae10 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74  separate.** rout
1ae20 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d  ine so that in m
1ae30 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76  ost cases the ov
1ae40 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67  erhead of moving
1ae50 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74   the stack point
1ae60 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64  er.** is avoided
1ae70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32  ..*/ .static u32
1ae80 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1ae90 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f   serialGet(.  co
1aea0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1aeb0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
1aec0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
1aed0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
1aee0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af00 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
1af10 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
1af20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af40 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
1af50 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
1af60 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d   */.){.  u64 x =
1af70 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1af80 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20  buf);.  u32 y = 
1af90 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1afa0 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c  uf+4);.  x = (x<
1afb0 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20  <32) + y;.  if( 
1afc0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
1afd0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
1afe0 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32  E-OF: R-29851-52
1aff0 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62  272 Value is a b
1b000 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74  ig-endian 64-bit
1b010 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d  .    ** twos-com
1b020 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1b030 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e   */.    pMem->u.
1b040 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
1b050 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1b060 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65   MEM_Int;.    te
1b070 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1b080 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i<0 );.  }else{.
1b090 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1b0a0 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31  OF: R-57343-4911
1b0b0 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1b0c0 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34  -endian IEEE 754
1b0d0 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20  -2008 64-bit.   
1b0e0 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
1b0f0 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69  nt number. */.#i
1b100 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1b110 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
1b120 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1b130 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f  ING_POINT).    /
1b140 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
1b150 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
1b160 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
1b170 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
1b180 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
1b190 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
1b1a0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
1b1b0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
1b1c0 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  .    ** defined 
1b1d0 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
1b1e0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1b1f0 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
1b200 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  ed.    ** endian
1b210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1b220 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
1b230 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
1b240 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74  000)<<32;.    st
1b250 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
1b260 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
1b270 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
1b280 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1b290 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61  Float(t2);.    a
1b2a0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
1b2b0 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
1b2c0 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
1b2d0 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
1b2e0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
1b2f0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
1b300 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
1b310 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20  em->u.r)==8 );. 
1b320 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
1b330 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
1b340 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e  memcpy(&pMem->u.
1b350 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
1b360 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
1b370 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
1b380 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d  N(pMem->u.r) ? M
1b390 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
1b3a0 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
1b3b0 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65   8;.}.u32 sqlite
1b3c0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
1b3d0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1b3e0 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
1b3f0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
1b400 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
1b410 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
1b420 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1b430 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
1b440 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
1b450 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
1b480 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
1b490 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
1b4a0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1b4b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
1b4c0 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75   { /* Internal u
1b4d0 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69  se only: NULL wi
1b4e0 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
1b4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b500 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63 68 61  ** UPDATE no-cha
1b510 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a  nge flag set */.
1b520 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1b530 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  s = MEM_Null|MEM
1b540 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65  _Zero;.      pMe
1b550 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
1b560 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20  pMem->u.nZero = 
1b570 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1b580 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1b590 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
1b5a0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
1b5b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
1b5c0 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
1b5d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1b5e0 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
1b5f0 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
1b600 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1b610 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1b620 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
1b630 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1b640 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1b650 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
1b660 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
1b670 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
1b680 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
1b690 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
1b6a0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1b6b0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
1b6c0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1b6d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1b6e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b6f0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1b700 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b710 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1b720 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1b730 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1b740 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1b750 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
1b760 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
1b770 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
1b780 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1b790 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1b7a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1b7b0 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
1b7c0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1b7d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1b7e0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1b7f0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1b800 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1b810 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
1b820 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1b830 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1b840 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
1b850 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1b860 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
1b870 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1b880 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
1b890 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1b8a0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1b8b0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
1b8c0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
1b8d0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1b8e0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1b8f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b900 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1b910 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
1b920 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1b930 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1b940 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1b950 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1b960 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
1b970 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
1b980 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
1b990 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1b9a0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1b9b0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1b9c0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1b9d0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
1b9e0 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
1b9f0 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
1ba00 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
1ba10 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
1ba20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
1ba30 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
1ba40 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
1ba50 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
1ba60 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
1ba70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
1ba80 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1ba90 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1baa0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1bab0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1bac0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
1bad0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1bae0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1baf0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1bb00 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
1bb10 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
1bb20 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
1bb30 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1bb40 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1bb50 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1bb60 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1bb70 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
1bb80 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1bb90 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1bba0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1bbb0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1bbc0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1bbd0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1bbe0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
1bbf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bc00 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
1bc10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1bc20 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
1bc30 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
1bc40 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
1bc50 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
1bc60 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
1bc70 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
1bc80 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
1bc90 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
1bca0 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
1bcb0 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
1bcc0 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
1bcd0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
1bce0 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
1bcf0 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
1bd00 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
1bd10 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
1bd20 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
1bd30 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
1bd40 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
1bd50 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1bd60 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
1bd70 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1bd80 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
1bd90 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bda0 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
1bdb0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1bdc0 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
1bdd0 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
1bde0 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
1bdf0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1be00 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
1be10 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1be20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1be30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1be40 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
1be50 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
1be60 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
1be70 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
1be80 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
1be90 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1bea0 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
1beb0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1bec0 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
1bed0 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
1bee0 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
1bef0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
1bf00 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1bf10 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
1bf20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
1bf30 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
1bf40 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
1bf50 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
1bf60 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
1bf70 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
1bf80 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
1bf90 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1bfa0 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
1bfb0 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
1bfc0 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
1bfd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1bfe0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
1bff0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
1c000 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
1c010 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
1c020 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
1c030 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
1c040 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
1c050 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1c060 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1c070 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
1c080 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1c090 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
1c0a0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1c0b0 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
1c0c0 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
1c0d0 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
1c0e0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
1c0f0 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1c100 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1c110 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1c120 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1c130 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1c140 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1c150 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1c160 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1c170 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1c180 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1c190 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1c1a0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1c1b0 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1c1c0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1c1d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1c1e0 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1c1f0 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1c200 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1c210 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1c220 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1c230 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1c240 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1c250 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1c260 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1c270 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1c280 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1c290 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1c2a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1c2b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c2c0 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fo              
1c2d0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1c2e0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1c2f0 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1c300 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1c310 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1c320 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1c330 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
1c340 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c350 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c360 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1c370 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20  red for *p */.  
1c380 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1c390 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1c3a0 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1c3b0 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1c3c0 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20  nKeyField+1);.  
1c3d0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1c3e0 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
1c3f0 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
1c400 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
1c410 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1c420 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   0;.  p->aMem = 
1c430 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
1c440 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
1c450 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1c460 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
1c470 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1c480 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
1c490 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1c4a0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1c4b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1c4c0 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1c4d0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1c4e0 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1c4f0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1c500 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1c510 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1c520 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1c530 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1c540 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1c550 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1c560 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1c570 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1c580 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1c590 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1c5a0 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1c5b0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1c5c0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1c5d0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1c5e0 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1c5f0 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1c600 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c610 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1c620 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1c630 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1c640 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1c650 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1c660 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1c670 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1c680 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1c690 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1c6a0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1c6b0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1c6c0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1c6d0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1c6e0 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
1c6f0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1c700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1c710 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1c720 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1c730 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1c760 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1c770 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1c780 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1c790 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1c7a0 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1c7b0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1c7c0 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1c7d0 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1c7e0 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1c7f0 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1c800 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1c810 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1c820 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
1c830 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1c840 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1c850 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
1c860 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1c870 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
1c880 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1c890 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
1c8a0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
1c8b0 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
1c8c0 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
1c8d0 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
1c8e0 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
1c8f0 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
1c900 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
1c910 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
1c920 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1c930 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1c940 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1c950 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1c960 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1c970 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1c980 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
1c990 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1c9a0 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31  o->nKeyField + 1
1c9b0 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
1c9c0 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = u;.}..#ifdef S
1c9d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1c9e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c9f0 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
1ca00 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
1ca10 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
1ca20 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
1ca30 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
1ca40 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
1ca50 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
1ca60 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1ca70 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1ca80 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
1ca90 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
1caa0 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
1cab0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1cac0 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
1cad0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
1cae0 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
1caf0 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
1cb00 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1cb10 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1cb20 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
1cb30 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
1cb40 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cb50 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
1cb60 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
1cb70 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
1cb80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1cb90 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1cba0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
1cbb0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
1cbc0 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
1cbd0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
1cbe0 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
1cbf0 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
1cc00 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1cc10 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
1cc20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1cc30 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1cc40 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
1cc50 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
1cc60 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
1cc70 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1cc80 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cca0 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
1ccb0 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1ccc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1ccd0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1cce0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1ccf0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
1cd00 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
1cd10 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1cd20 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
1cd30 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
1cd40 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1cd50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1cd60 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
1cd70 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
1cd80 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
1cd90 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1cda0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1cdb0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1cdc0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
1cdd0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1cde0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
1cdf0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1ce00 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
1ce10 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
1ce20 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1ce30 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1ce40 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
1ce50 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1ce60 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
1ce70 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
1ce80 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1ce90 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
1cea0 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
1ceb0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1cec0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1ced0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1cee0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1cef0 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
1cf00 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
1cf10 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
1cf20 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
1cf30 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1cf40 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
1cf50 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
1cf60 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
1cf70 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
1cf80 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
1cf90 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
1cfa0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
1cfb0 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
1cfc0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
1cfd0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
1cfe0 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
1cff0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
1d000 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
1d010 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
1d020 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
1d030 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
1d040 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
1d050 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
1d060 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
1d070 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
1d080 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1d090 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
1d0a0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
1d0b0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1d0c0 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
1d0d0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
1d0e0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
1d0f0 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
1d100 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
1d110 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1d120 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1d130 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
1d140 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
1d150 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
1d160 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
1d170 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  rt( pKeyInfo->nA
1d180 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  llField>=pPKey2-
1d190 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1d1a0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1d1b0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1d1c0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1d1d0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1d1e0 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b  ->nKeyField>0 );
1d1f0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1d200 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1d210 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1d220 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1d230 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
1d240 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
1d250 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
1d260 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
1d270 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
1d280 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1d290 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
1d2a0 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
1d2b0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1d2c0 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
1d2d0 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
1d2e0 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
1d2f0 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
1d300 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
1d310 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
1d320 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
1d330 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
1d340 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
1d350 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1d360 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
1d370 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
1d380 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
1d390 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
1d3a0 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
1d3b0 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
1d3c0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
1d3d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1d3e0 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
1d3f0 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
1d400 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c     if( d1+serial
1d410 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b  _type1+2>(u32)nK
1d420 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73  ey1.     && d1+s
1d430 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1d440 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1d450 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31  ype1)>(u32)nKey1
1d460 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62   .    ){.      b
1d470 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1d480 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1d490 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
1d4a0 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1d4b0 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1d4c0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1d4d0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1d4e0 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
1d4f0 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
1d500 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
1d510 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d520 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
1d530 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
1d540 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i], pKeyInfo->aC
1d550 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  oll[i]);.    if(
1d560 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1d570 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1d580 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1d590 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1d5a0 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
1d5b0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1d5c0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1d5d0 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
1d5e0 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
1d5f0 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
1d600 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
1d610 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62  }.      goto deb
1d620 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20  ugCompareEnd;.  
1d630 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
1d640 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
1d650 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1d660 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
1d670 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1d680 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1d690 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1d6a0 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1d6b0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1d6c0 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1d6d0 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1d6e0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1d6f0 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1d700 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1d710 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1d720 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1d730 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1d740 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1d750 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1d760 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1d770 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
1d780 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1d790 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1d7a0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1d7b0 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1d7c0 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1d7d0 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1d7e0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1d7f0 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65   rc = pPKey2->de
1d800 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67  fault_rc;..debug
1d810 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66  CompareEnd:.  if
1d820 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d  ( desiredResult=
1d830 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65  =0 && rc==0 ) re
1d840 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1d850 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26  siredResult<0 &&
1d860 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31   rc<0 ) return 1
1d870 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1d880 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20  esult>0 && rc>0 
1d890 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1d8a0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1d8b0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1d8c0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1d8d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1d8e0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1d8f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
1d900 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d910 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1d920 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1d930 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73   (a.k.a. columns
1d940 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  ) in the record 
1d950 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79  given by.** pKey
1d960 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69  ,nKey.  The veri
1d970 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75  fy that this cou
1d980 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  nt is less than 
1d990 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a  or equal to the.
1d9a0 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62  ** limit given b
1d9b0 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  y pKeyInfo->nAll
1d9c0 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Field..**.** If 
1d9d0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
1d9e0 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
1d9f0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1da00 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  the high-speed.*
1da10 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  * vdbeRecordComp
1da20 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62  areInt() and vdb
1da30 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1da40 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20  ring() routines 
1da50 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
1da60 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20   correctly.  If 
1da70 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76  this assert() ev
1da80 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f  er fires, it pro
1da90 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74  bably means.** t
1daa0 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e  hat the KeyInfo.
1dab0 6e 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79  nKeyField or Key
1dac0 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76  Info.nAllField v
1dad0 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75  alues were compu
1dae0 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74  ted.** incorrect
1daf0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1db00 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65  id vdbeAssertFie
1db10 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1db20 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  its(.  int nKey,
1db30 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1db40 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f  y,   /* The reco
1db50 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20  rd to verify */ 
1db60 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
1db70 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20   *pKeyInfo      
1db80 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65   /* Compare size
1db90 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e   with this KeyIn
1dba0 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  fo */.){.  int n
1dbb0 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32  Field = 0;.  u32
1dbc0 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64   szHdr;.  u32 id
1dbd0 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64  x;.  u32 notUsed
1dbe0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1dbf0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1dc00 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1dc10 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69  char*)pKey;..  i
1dc20 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1dc30 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20  return;.  idx = 
1dc40 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1dc50 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65  , szHdr);.  asse
1dc60 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20  rt( nKey>=0 );. 
1dc70 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d   assert( szHdr<=
1dc80 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77  (u32)nKey );.  w
1dc90 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1dca0 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ){.    idx += ge
1dcb0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69  tVarint32(aKey+i
1dcc0 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20  dx, notUsed);.  
1dcd0 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a    nField++;.  }.
1dce0 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
1dcf0 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41   <= pKeyInfo->nA
1dd00 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c  llField );.}.#el
1dd10 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
1dd20 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1dd30 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42  WithinLimits(A,B
1dd40 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,C).#endif../*.*
1dd50 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e  * Both *pMem1 an
1dd60 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e  d *pMem2 contain
1dd70 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20   string values. 
1dd80 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20  Compare the two 
1dd90 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20  values.** using 
1dda0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1ddb0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73  quence pColl. As
1ddc0 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61   usual, return a
1ddd0 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f   negative , zero
1dde0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1ddf0 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20  value if *pMem1 
1de00 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1de10 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
1de20 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d  r than .** *pMem
1de30 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  2, respectively.
1de40 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72   Similar in spir
1de50 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d  it to "rc = (*pM
1de60 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b  em1) - (*pMem2);
1de70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1de80 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1de90 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
1dea0 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e  em *pMem1,.  con
1deb0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20  st Mem *pMem2,. 
1dec0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1ded0 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63  pColl,.  u8 *prc
1dee0 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1def0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1df00 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65  n OOM occurs, se
1df10 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1df20 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d  M */.){.  if( pM
1df30 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  em1->enc==pColl-
1df40 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  >enc ){.    /* T
1df50 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  he strings are a
1df60 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f  lready in the co
1df70 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20  rrect encoding. 
1df80 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a   Call the.     *
1df90 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * comparison fun
1dfa0 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a  ction directly *
1dfb0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f  /.    return pCo
1dfc0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1dfd0 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70  pUser,pMem1->n,p
1dfe0 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e  Mem1->z,pMem2->n
1dff0 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65  ,pMem2->z);.  }e
1e000 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1e010 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
1e020 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65  *v1, *v2;.    Me
1e030 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32  m c1;.    Mem c2
1e040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e050 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d  eMemInit(&c1, pM
1e060 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1e070 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1e080 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20  dbeMemInit(&c2, 
1e090 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1e0a0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1e0b0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1e0c0 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
1e0d0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1e0e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1e0f0 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
1e100 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
1e110 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
1e120 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1e130 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
1e140 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1e150 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1e160 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1e170 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1e180 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66  ll->enc);.    if
1e190 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
1e1a0 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
1e1b0 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72  prcErr ) *prcErr
1e1c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1e1d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d  BKPT;.      rc =
1e1e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1e1f0 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d       rc = pColl-
1e200 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1e210 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32  er, c1.n, v1, c2
1e220 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20  .n, v2);.    }. 
1e230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e240 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20  mRelease(&c1);. 
1e250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e260 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20  mRelease(&c2);. 
1e270 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e280 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
1e290 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75  nput pBlob is gu
1e2a0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1e2b0 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f   Blob that is no
1e2c0 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68  t marked.** with
1e2d0 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75   MEM_Zero.  Retu
1e2e0 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 6f  rn true if it co
1e2f0 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c  uld be a zero-bl
1e300 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ob..*/.static in
1e310 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73  t isAllZero(cons
1e320 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1e330 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1e340 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1e350 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29  {.    if( z[i] )
1e360 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e370 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1e380 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1e390 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1e3a0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1e3b0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1e3c0 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1e3d0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1e3e0 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1e3f0 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1e400 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1e410 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1e420 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1e430 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1e440 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1e450 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f  ssor..*/.SQLITE_
1e460 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c  NOINLINE int sql
1e470 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1e480 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20  const Mem *pB1, 
1e490 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b  const Mem *pB2){
1e4a0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1e4b0 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69  n1 = pB1->n;.  i
1e4c0 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a  nt n2 = pB2->n;.
1e4d0 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73  .  /* It is poss
1e4e0 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42  ible to have a B
1e4f0 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68  lob value that h
1e500 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f  as some non-zero
1e510 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f   content.  ** fo
1e520 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63  llowed by zero c
1e530 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61  ontent.  But tha
1e540 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20  t only comes up 
1e550 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64  for Blobs formed
1e560 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f  .  ** by the OP_
1e570 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1e580 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62  e, and such Blob
1e590 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73  s never get pass
1e5a0 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
1e5b0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1e5c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
1e5d0 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB1->flags & MEM
1e5e0 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d  _Zero)==0 || n1=
1e5f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e600 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB2->flags & ME
1e610 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32  M_Zero)==0 || n2
1e620 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  ==0 );..  if( (p
1e630 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66  B1->flags|pB2->f
1e640 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f  lags) & MEM_Zero
1e650 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d   ){.    if( pB1-
1e660 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c  >flags & pB2->fl
1e670 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1e680 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1e690 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42  B1->u.nZero - pB
1e6a0 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  2->u.nZero;.    
1e6b0 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66  }else if( pB1->f
1e6c0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1e6d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
1e6e0 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20  AllZero(pB2->z, 
1e6f0 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e  pB2->n) ) return
1e700 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1e710 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d  n pB1->u.nZero -
1e720 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n2;.    }else{.
1e730 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
1e740 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31  Zero(pB1->z, pB1
1e750 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31  ->n) ) return +1
1e760 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  ;.      return n
1e770 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f  1 - pB2->u.nZero
1e780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20  ;.    }.  }.  c 
1e790 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1e7a0 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f   pB2->z, n1>n2 ?
1e7b0 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28   n2 : n1);.  if(
1e7c0 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1e7d0 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b   return n1 - n2;
1e7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63  .}../*.** Do a c
1e7f0 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
1e800 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65  n a 64-bit signe
1e810 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20  d integer and a 
1e820 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d  64-bit floating-
1e830 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e  point.** number.
1e840 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1e850 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1e860 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1e870 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20  t (i64) is less 
1e880 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74  than,.** equal t
1e890 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1e8a0 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64  an the second (d
1e8b0 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  ouble)..*/.stati
1e8c0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74  c int sqlite3Int
1e8d0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34  FloatCompare(i64
1e8e0 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20   i, double r){. 
1e8f0 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47   if( sizeof(LONG
1e900 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29  DOUBLE_TYPE)>8 )
1e910 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45  {.    LONGDOUBLE
1e920 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44  _TYPE x = (LONGD
1e930 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20  OUBLE_TYPE)i;.  
1e940 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75    if( x<r ) retu
1e950 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78  rn -1;.    if( x
1e960 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1e970 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e980 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79  }else{.    i64 y
1e990 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a  ;.    double s;.
1e9a0 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33      if( r<-92233
1e9b0 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30  72036854775808.0
1e9c0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1e9d0 20 20 69 66 28 20 72 3e 3d 39 32 32 33 33 37 32    if( r>=9223372
1e9e0 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29  036854775808.0 )
1e9f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1ea00 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20  y = (i64)r;.    
1ea10 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e  if( i<y ) return
1ea20 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79   -1;.    if( i>y
1ea30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ea40 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b    s = (double)i;
1ea50 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72  .    if( s<r ) r
1ea60 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1ea70 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( s>r ) return +
1ea80 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1ea90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1eaa0 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
1eab0 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68   contained by th
1eac0 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  e two memory cel
1ead0 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  ls, returning.**
1eae0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20   negative, zero 
1eaf0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1eb00 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1eb10 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1eb20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
1eb30 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f  pMem2. Sorting o
1eb40 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66  rder is NULL's f
1eb50 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  irst, followed b
1eb60 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67  y numbers (integ
1eb70 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73  ers.** and reals
1eb80 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63  ) sorted numeric
1eb90 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  ally, followed b
1eba0 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62  y text ordered b
1ebb0 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  y the collating.
1ebc0 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ** sequence pCol
1ebd0 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c  l and finally bl
1ebe0 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20  ob's ordered by 
1ebf0 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
1ec00 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  Two NULL values 
1ec10 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1ec20 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e  qual by this fun
1ec30 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1ec40 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1ec50 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1ec60 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  , const Mem *pMe
1ec70 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  m2, const CollSe
1ec80 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74  q *pColl){.  int
1ec90 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63   f1, f2;.  int c
1eca0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a  ombined_flags;..
1ecb0 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c    f1 = pMem1->fl
1ecc0 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d  ags;.  f2 = pMem
1ecd0 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62  2->flags;.  comb
1ece0 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c  ined_flags = f1|
1ecf0 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73  f2;.  assert( !s
1ed00 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
1ed10 6f 77 53 65 74 28 70 4d 65 6d 31 29 20 26 26 20  owSet(pMem1) && 
1ed20 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49  !sqlite3VdbeMemI
1ed30 73 52 6f 77 53 65 74 28 70 4d 65 6d 32 29 20 29  sRowSet(pMem2) )
1ed40 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  ;. .  /* If one 
1ed50 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
1ed60 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
1ed70 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
1ed80 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
1ed90 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
1eda0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1edb0 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1edc0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
1edd0 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29  rn (f2&MEM_Null)
1ede0 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29   - (f1&MEM_Null)
1edf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c  ;.  }..  /* At l
1ee00 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
1ee10 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20  two values is a 
1ee20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66  number.  */.  if
1ee30 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1ee40 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
1ee50 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  al) ){.    if( (
1ee60 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1ee70 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1ee80 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1ee90 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1eea0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1eeb0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1eec0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1eed0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1eee0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1eef0 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1ef00 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1ef10 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1ef20 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r < pMem2->u.
1ef30 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1ef40 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1ef50 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r > pMem2->u.r
1ef60 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ef70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ef80 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1ef90 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1efa0 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1efb0 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1efc0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1efd0 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1efe0 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70  re(pMem1->u.i, p
1eff0 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem2->u.r);.    
1f000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f010 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1f020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1f030 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1f040 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1f050 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f2&MEM_Int)!=0 
1f060 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f070 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  n -sqlite3IntFlo
1f080 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d  atCompare(pMem2-
1f090 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72  >u.i, pMem1->u.r
1f0a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f0b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1f0c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1f0d0 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .    return +1;.
1f0e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1f0f0 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
1f100 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
1f110 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
1f120 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
1f130 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
1f140 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
1f150 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
1f160 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
1f170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1f180 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
1f190 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
1f1a0 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
1f1b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f1c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1f1d0 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
1f1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1f1f0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
1f200 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1f210 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
1f220 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d   || pMem1->db->m
1f230 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1f240 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1f250 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1f260 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1f270 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1f280 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1f290 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1f2a0 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1f2b0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1f2c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1f2d0 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1f2e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1f2f0 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1f300 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1f310 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1f320 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1f330 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1f340 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1f350 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1f360 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1f370 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1f380 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1f390 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1f3a0 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1f3b0 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1f3c0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1f3d0 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1f3e0 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1f3f0 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1f400 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1f410 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1f420 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1f430 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1f440 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1f450 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1f460 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1f470 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1f480 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1f490 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1f4a0 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1f4b0 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1f4c0 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1f4d0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1f4e0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1f4f0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1f500 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1f510 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1f520 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1f530 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1f540 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1f550 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1f560 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1f570 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1f580 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1f590 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1f5a0 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1f5b0 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1f5c0 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1f5d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1f5e0 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1f5f0 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1f600 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1f610 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1f620 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1f630 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1f640 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1f650 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1f660 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1f670 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1f680 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1f690 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1f6a0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1f6b0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1f6c0 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1f6d0 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1f6e0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1f6f0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1f700 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1f710 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1f720 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1f730 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1f740 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1f750 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1f760 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1f770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1f780 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1f790 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1f7a0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1f7b0 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1f7c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f7d0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1f7e0 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1f7f0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1f800 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1f810 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1f820 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1f830 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f840 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1f850 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1f860 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f870 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1f880 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1f890 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1f8a0 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1f8b0 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1f8c0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1f8d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f8e0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1f8f0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1f900 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1f910 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1f920 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1f930 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1f940 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1f950 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1f960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f970 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1f980 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1f990 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1f9a0 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1f9b0 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1f9c0 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1f9d0 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1f9e0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1f9f0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1fa00 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1fa10 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1fa20 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1fa30 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1fa40 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1fa50 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1fa60 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1fa70 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1fa80 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1fa90 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1faa0 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1fab0 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1fac0 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1fad0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1fae0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1faf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1fb00 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1fb10 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1fb20 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1fb30 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1fb40 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1fb50 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1fb60 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1fb70 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1fb80 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1fb90 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1fba0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1fbb0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1fbc0 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1fbd0 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1fbe0 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1fbf0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1fc00 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1fc10 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1fc20 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1fc30 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1fc40 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1fc50 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1fc60 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1fc70 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1fc80 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1fc90 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1fca0 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1fcb0 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1fcc0 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1fcd0 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1fce0 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1fcf0 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1fd00 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1fd10 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1fd20 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1fd30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1fd40 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fd50 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1fd60 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1fd70 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1fd80 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1fd90 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1fda0 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1fdb0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1fdc0 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fde0 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1fdf0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1fe00 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1fe30 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1fe40 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1fe50 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1fe80 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1fe90 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1fea0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fec0 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1fed0 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1fee0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ff10 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1ff20 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1ff30 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff50 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1ff60 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1ff70 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1ff80 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1ff90 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1ffa0 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1ffb0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  o *pKeyInfo;.  c
1ffc0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ffd0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1ffe0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1fff0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
20000 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
20010 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
20020 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
20030 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
20040 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
20050 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
20060 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
20070 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
20080 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
20090 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
200a0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
200b0 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
200c0 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
200d0 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
200e0 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
200f0 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
20100 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
20110 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
20120 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
20130 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
20140 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
20150 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
20160 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
20170 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
20180 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
20190 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
201a0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
201b0 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
201c0 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
201d0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
201e0 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
201f0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20200 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20210 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
20220 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
20230 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
20240 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
20250 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
20260 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
20270 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
20280 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
20290 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
202a0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
202b0 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50  o->nAllField>=pP
202c0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20  Key2->nField .  
202d0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
202e0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
202f0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
20300 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
20310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
20320 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
20330 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  KeyField>0 );.  
20340 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
20350 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
20360 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
20370 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
20380 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
20390 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
203a0 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
203b0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
203c0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
203d0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
203e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
203f0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
20400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
20410 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
20420 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
20430 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20440 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
20450 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20460 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
20470 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
20480 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =7 ){.        sq
20490 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
204a0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
204b0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
204c0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
204d0 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
204e0 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75  tCompare(pRhs->u
204f0 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20  .i, mem1.u.r);. 
20500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20510 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
20520 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
20530 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
20540 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
20550 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
20560 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
20570 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
20580 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
20590 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
205a0 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
205b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
205c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
205d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
205e0 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
205f0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
20600 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
20610 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
20620 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
20630 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
20640 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
20650 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =10 ){.        /
20660 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31  * Serial types 1
20670 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65  2 or greater are
20680 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
20690 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  bs (greater than
206a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
206b0 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61  ers). Types 10 a
206c0 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e  nd 11 are curren
206d0 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f  tly "reserved fo
206e0 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20  r future .      
206f0 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74    ** use", so it
20700 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20   doesn't really 
20710 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20  matter what the 
20720 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
20730 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
20740 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63  them to numberic
20750 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f   values are.  */
20760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
20770 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20780 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
20790 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
207a0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
207b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
207c0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
207d0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
207e0 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
207f0 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
20800 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
20810 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
20820 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r<pRhs->u.r )
20830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20840 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
20850 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
20860 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r>pRhs->u.r ){
20870 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
20880 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = +1;.          
20890 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
208a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
208b0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
208c0 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c  ompare(mem1.u.i,
208d0 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20   pRhs->u.r);.   
208e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
208f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
20900 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
20910 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
20920 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
20930 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
20940 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
20950 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
20960 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
20970 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
20980 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
20990 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
209a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
209b0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
209c0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
209d0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
209e0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
209f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a00 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
20a10 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
20a20 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
20a30 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
20a40 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
20a50 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
20a60 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
20a70 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
20a80 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
20a90 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
20aa0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
20ab0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
20ac0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
20ad0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
20ae0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20af0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b10 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
20b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
20b30 28 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  ( (pKeyInfo = pP
20b40 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d  Key2->pKeyInfo)-
20b50 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
20b60 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
20b70 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
20b80 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
20b90 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
20ba0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
20bb0 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
20bc0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
20bd0 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
20be0 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
20bf0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
20c00 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
20c10 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
20c20 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
20c30 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
20c40 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
20c50 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20c70 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
20c80 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
20c90 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
20ca0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
20cb0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
20cc0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
20cd0 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
20ce0 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
20cf0 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
20d00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20d10 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
20d20 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
20d30 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
20d40 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
20d50 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73     assert( (pRhs
20d60 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
20d70 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  ro)==0 || pRhs->
20d80 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65  n==0 );.      ge
20d90 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20da0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
20db0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
20dc0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
20dd0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
20de0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
20df0 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
20e00 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
20e10 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
20e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20e30 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
20e40 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
20e50 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
20e60 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20e70 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
20e80 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
20e90 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20ea0 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
20eb0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
20ec0 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
20ed0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
20ef0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
20f00 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
20f10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
20f20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
20f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
20f40 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
20f50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
20f60 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
20f70 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
20f80 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
20f90 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61  ((const char*)&a
20fa0 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29  Key1[d1],nStr) )
20fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20fc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
20fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20fe0 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70     rc = nStr - p
20ff0 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rhs->u.nZero;.  
21000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21020 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
21030 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
21040 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21050 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
21060 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
21070 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
21080 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
21090 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
210a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
210b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
210c0 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
210d0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
210e0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
210f0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
21100 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
21110 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
21120 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
21130 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
21140 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
21150 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
21160 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
21170 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
21180 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
21190 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
211a0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
211b0 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
211c0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
211d0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
211e0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
211f0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
21200 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
21210 2b 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 50  +;.    if( i==pP
21220 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62  Key2->nField ) b
21230 72 65 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b  reak;.    pRhs++
21240 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
21250 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
21260 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
21270 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
21280 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
21290 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
212a0 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
212b0 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
212c0 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
212d0 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
212e0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
212f0 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
21300 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
21310 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
21320 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
21330 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
21340 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
21350 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
21360 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
21370 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
21380 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
21390 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
213a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
213b0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
213c0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
213d0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
213e0 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
213f0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
21400 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
21410 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
21420 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
21430 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
21440 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
21450 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
21460 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f   */.  assert( CO
21470 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20  RRUPT_DB .      
21480 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f   || vdbeRecordCo
21490 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
214a0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
214b0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
214c0 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  _rc) .       || 
214d0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
214e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
214f0 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32  ed.  );.  pPKey2
21500 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
21510 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
21520 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74  efault_rc;.}.int
21530 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21540 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
21550 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
21560 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
21570 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
21580 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
21590 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a  Key2          /*
215a0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
215b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
215c0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
215d0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
215e0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
215f0 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
21600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21610 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
21620 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
21630 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21640 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
21650 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
21660 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
21670 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
21680 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
21690 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
216a0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
216b0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
216c0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
216d0 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
216e0 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
216f0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
21700 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
21710 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
21720 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
21730 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
21740 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
21750 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
21760 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
21770 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
21780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
21790 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
217a0 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
217b0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
217c0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
217d0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
217e0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
217f0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
21800 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
21810 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
21820 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
21830 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
21840 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
21850 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
21860 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
21870 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
21880 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
21890 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c    i64 v;.  i64 l
218a0 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
218b0 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
218c0 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
218d0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
218e0 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
218f0 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
21900 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
21910 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
21920 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
21930 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
21940 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
21950 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
21960 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
21970 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
21980 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
21990 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
219a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
219b0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
219c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
219d0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
219e0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
219f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21a00 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
21a10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21a20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
21a30 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
21a40 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
21a50 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
21a60 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
21a70 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
21a80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21a90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
21aa0 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
21ab0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
21ac0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
21ad0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
21ae0 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
21af0 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
21b00 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
21b10 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21b20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21b30 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
21b40 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
21b50 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
21b60 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
21b70 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
21b80 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
21b90 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
21ba0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
21bb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21bc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
21bd0 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
21be0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
21bf0 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
21c00 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
21c10 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
21c20 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
21c30 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
21c40 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
21c50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21c60 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
21c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21c80 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
21c90 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
21ca0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
21cb0 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
21cc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
21cd0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
21ce0 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
21cf0 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
21d00 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
21d10 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
21d20 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
21d30 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
21d40 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
21d50 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
21d60 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
21d70 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
21d80 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
21d90 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
21da0 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
21db0 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
21dc0 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
21dd0 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
21de0 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
21df0 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
21e00 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
21e10 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
21e20 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
21e30 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
21e40 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
21e50 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
21e60 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
21e70 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
21e80 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
21e90 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21ea0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21eb0 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
21ec0 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
21ed0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
21ee0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
21ef0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21f00 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50  );.  }..  v = pP
21f10 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e  Key2->aMem[0].u.
21f20 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  i;.  if( v>lhs )
21f30 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
21f40 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
21f50 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
21f60 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21f70 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
21f80 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
21f90 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
21fa0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
21fb0 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
21fc0 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
21fd0 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
21fe0 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
21ff0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
22000 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22010 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
22020 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22030 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
22040 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
22050 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
22060 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
22070 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
22080 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
22090 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
220a0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
220b0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
220c0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
220d0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
220e0 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
220f0 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
22100 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
22110 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
22120 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22130 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
22140 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
22150 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22160 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
22170 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
22180 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22190 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
221a0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
221b0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
221c0 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
221d0 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
221e0 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
221f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
22200 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
22210 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
22220 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
22230 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
22240 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
22250 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
22260 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
22270 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
22280 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
22290 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
222a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
222b0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
222c0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
222d0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
222e0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
222f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
22300 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
22310 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
22320 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
22330 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
22340 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
22350 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
22360 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
22370 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
22380 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
22390 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
223a0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
223b0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
223c0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
223d0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
223e0 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
223f0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
22400 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
22410 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
22420 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
22430 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
22440 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
22450 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
22460 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
22470 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
22480 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
22490 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
224a0 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
224b0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
224c0 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
224d0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
224e0 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
224f0 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
22500 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
22510 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
22520 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
22530 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22540 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
22550 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
22560 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
22570 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
22580 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
22590 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
225a0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
225b0 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
225c0 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
225d0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
225e0 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
225f0 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
22600 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
22610 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
22620 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
22630 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
22640 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
22650 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22660 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
22670 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
22680 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
22690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
226a0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
226b0 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
226c0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
226d0 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
226e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
226f0 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
22700 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
22710 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
22720 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
22730 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
22740 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
22750 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
22760 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22770 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
22780 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
22790 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
227a0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
227b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
227c0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
227d0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
227e0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
227f0 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
22800 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
22810 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
22820 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
22830 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
22840 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22850 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
22860 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
22870 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
22880 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
22890 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
228a0 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
228b0 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
228c0 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
228d0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
228e0 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
228f0 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
22900 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
22910 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
22920 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
22930 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
22940 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
22950 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
22960 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
22970 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
22980 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
22990 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
229a0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
229b0 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
229c0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
229d0 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
229e0 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
229f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
22a00 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
22a10 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
22a20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
22a30 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
22a40 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
22a50 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
22a60 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
22a70 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
22a80 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
22a90 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
22aa0 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
22ab0 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
22ac0 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
22ad0 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
22ae0 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
22af0 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
22b00 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
22b10 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
22b20 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
22b30 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
22b40 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
22b50 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
22b60 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
22b70 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
22b80 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
22b90 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
22ba0 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
22bb0 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
22bc0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
22bd0 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
22be0 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
22bf0 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
22c00 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
22c10 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
22c20 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
22c30 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
22c40 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
22c50 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  tes.  */.  if( p
22c60 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ->pKeyInfo->nAll
22c70 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20  Field<=13 ){.   
22c80 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e   int flags = p->
22c90 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20  aMem[0].flags;. 
22ca0 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e     if( p->pKeyIn
22cb0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
22cc0 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  ] ){.      p->r1
22cd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72   = 1;.      p->r
22ce0 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  2 = -1;.    }els
22cf0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  e{.      p->r1 =
22d00 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32   -1;.      p->r2
22d10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
22d20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
22d30 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72  _Int) ){.      r
22d40 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
22d50 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20  CompareInt;.    
22d60 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
22d70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
22d80 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
22d90 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
22da0 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ll );.    testca
22db0 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
22dc0 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20  Blob );.    if( 
22dd0 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  (flags & (MEM_Re
22de0 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  al|MEM_Null|MEM_
22df0 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e  Blob))==0 && p->
22e00 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
22e10 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  0]==0 ){.      a
22e20 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d  ssert( flags & M
22e30 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20  EM_Str );.      
22e40 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
22e50 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a  dCompareString;.
22e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
22e70 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
22e80 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a  ecordCompare;.}.
22e90 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
22ea0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
22eb0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
22ec0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
22ed0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
22ee0 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
22ef0 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
22f00 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
22f10 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
22f20 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
22f30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
22f40 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
22f50 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
22f60 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
22f70 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
22f80 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
22f90 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
22fa0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
22fb0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
22fc0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
22fd0 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
22fe0 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
22ff0 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
23000 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
23010 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
23020 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
23030 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
23040 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
23050 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
23060 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
23070 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
23080 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
23090 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
230a0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
230b0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
230c0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
230d0 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
230e0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
230f0 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
23100 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65   /* Get the size
23110 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
23120 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63  try.  Only indic
23130 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65  es entries of le
23140 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69  ss.  ** than 2Gi
23150 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20  B are support - 
23160 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d  anything large m
23170 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20  ust be database 
23180 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a  corruption..  **
23190 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20   Any corruption 
231a0 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73  is detected in s
231b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
231c0 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67  CellPtr(), thoug
231d0 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  h, so.  ** this 
231e0 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20  code can safely 
231f0 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c  assume that nCel
23200 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20  lKey is 32-bits 
23210 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
23220 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23230 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
23240 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
23250 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
23260 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
23270 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
23280 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
23290 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
232a0 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
232b0 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
232c0 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
232d0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
232e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
232f0 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
23300 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
23310 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
23320 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
23330 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
23340 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
23350 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
23360 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
23370 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
23380 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
23390 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
233a0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
233b0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
233c0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
233d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
233e0 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66  Hdr==m.n );.  if
233f0 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
23400 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72  <3 || (int)szHdr
23410 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  >m.n) ){.    got
23420 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
23430 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
23440 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
23450 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
23460 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
23470 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
23480 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
23490 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
234a0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
234b0 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
234c0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
234d0 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
234e0 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
234f0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
23500 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
23510 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
23520 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
23530 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
23540 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
23550 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
23560 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
23570 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
23580 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
23590 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
235a0 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
235b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
235c0 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
235d0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
235e0 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
235f0 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
23600 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
23610 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
23620 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
23630 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
23640 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
23650 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74  [typeRowid];.  t
23660 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
23670 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
23680 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
23690 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
236a0 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
236b0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
236c0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
236d0 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
236e0 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
236f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
23700 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
23710 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
23720 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
23730 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
23740 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
23750 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
23760 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
23770 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
23780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23790 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
237a0 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
237b0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
237c0 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
237d0 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
237e0 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
237f0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
23800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
23810 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
23820 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
23830 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c  stcase( m.szMall
23840 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  oc!=0 );.  sqlit
23850 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
23860 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
23870 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23880 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  PT;.}../*.** Com
23890 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
238a0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
238b0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
238c0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67  s pointing to ag
238d0 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
238e0 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61   string in pUnpa
238f0 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74  cked.  Write int
23900 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
23910 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
23920 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
23930 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
23940 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
23950 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
23960 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b  ter than pUnpack
23970 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ed.  Return SQLI
23980 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
23990 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65  ..**.** pUnpacke
239a0 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  d is either crea
239b0 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
239c0 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
239d0 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
239e0 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
239f0 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
23a00 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
23a10 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
23a20 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
23a30 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48  ored as well.  H
23a40 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ence, this routi
23a50 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73  ne only compares
23a60 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a   the prefixes .*
23a70 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72  * of the keys pr
23a80 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
23a90 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20   rowid, not the 
23aa0 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69  entire key..*/.i
23ab0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
23ac0 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73  xKeyCompare(.  s
23ad0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
23b00 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
23b10 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b30 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
23b40 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
23b50 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
23b60 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20  d *pUnpacked,   
23b70 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
23b80 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a  version of key *
23b90 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bb0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
23bc0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
23bd0 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
23be0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
23bf0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
23c00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
23c10 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
23c20 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
23c30 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
23c40 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75  ;.  pCur = pC->u
23c50 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73  c.pCursor;.  ass
23c60 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
23c70 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
23c80 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b  Cur) );.  nCellK
23c90 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
23ca0 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
23cb0 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65  r);.  /* nCellKe
23cc0 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
23cd0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
23ce0 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
23cf0 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
23d00 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
23d10 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
23d20 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
23d30 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
23d40 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
23d50 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
23d60 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
23d70 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
23d80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23d90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23da0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
23db0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
23dc0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
23dd0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
23de0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
23df0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29  32)nCellKey, &m)
23e00 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
23e10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
23e20 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
23e30 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
23e40 72 65 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20  reWithSkip(m.n, 
23e50 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20  m.z, pUnpacked, 
23e60 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
23e70 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
23e80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23e90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
23ea0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
23eb0 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
23ec0 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
23ed0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
23ee0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
23ef0 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
23f00 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
23f10 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
23f20 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
23f30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
23f40 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
23f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23f60 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
23f70 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
23f80 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
23f90 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
23fa0 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
23fb0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
23fc0 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
23fd0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
23fe0 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
23ff0 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
24000 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
24010 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
24020 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
24030 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
24040 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
24050 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
24060 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
24070 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
24080 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
24090 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
240a0 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
240b0 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
240c0 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
240d0 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
240e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
240f0 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
24100 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
24110 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
24120 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
24130 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
24140 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
24150 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
24160 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
24170 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
24180 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
24190 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
241a0 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
241b0 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
241c0 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
241d0 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
241e0 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
241f0 0a 2a 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20  .**.** If iCode 
24200 69 73 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72  is 1, then expir
24210 61 74 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72  ation is advisor
24220 79 2e 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  y.  The statemen
24230 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  t should.** be r
24240 65 70 72 65 70 61 72 65 64 20 62 65 66 6f 72 65  eprepared before
24250 20 62 65 69 6e 67 20 72 65 73 74 61 72 74 65 64   being restarted
24260 2c 20 62 75 74 20 69 66 20 69 74 20 69 73 20 61  , but if it is a
24270 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a  lready running.*
24280 2a 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20  * it is allowed 
24290 74 6f 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  to run to comple
242a0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  tion..**.** Inte
242b0 72 6e 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rnally, this fun
242c0 63 74 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20  ction just sets 
242d0 74 68 65 20 56 64 62 65 2e 65 78 70 69 72 65 64  the Vdbe.expired
242e0 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20   flag on all.** 
242f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
24300 6e 74 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69  nts.  The flag i
24310 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61  s set to 1 for a
24320 6e 20 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69  n immediate expi
24330 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65  ration.** and se
24340 74 20 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64  t to 2 for an ad
24350 76 69 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f  visory expiratio
24360 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
24370 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
24380 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
24390 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64  e3 *db, int iCod
243a0 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  e){.  Vdbe *p;. 
243b0 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
243c0 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
243d0 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
243e0 65 64 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20  ed = iCode+1;.  
243f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
24400 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
24410 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
24420 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
24430 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
24440 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
24450 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
24460 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24470 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20   SQLITE_PREPARE 
24480 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64 62 65  flags for a Vdbe
24490 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56  ..*/.u8 sqlite3V
244a0 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
244b0 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
244c0 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b  rn v->prepFlags;
244d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
244e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
244f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
24500 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
24510 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
24520 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
24530 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
24540 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
24550 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
24560 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
24570 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
24580 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
24590 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
245a0 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
245b0 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
245c0 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
245d0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
245e0 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
245f0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
24600 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
24610 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
24620 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
24630 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
24640 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
24650 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
24660 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
24670 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
24680 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
24690 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
246a0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
246b0 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
246c0 20 20 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e      assert( (v->
246d0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
246e0 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d  TE_EnableQPSG)==
246f0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
24700 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
24710 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
24720 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
24730 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
24740 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
24750 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
24760 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24770 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
24780 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
24790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
247a0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
247b0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
247c0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
247d0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
247e0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
247f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24800 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
24810 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
24820 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
24830 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
24840 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
24850 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
24860 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
24870 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
24880 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
24890 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
248a0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
248b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
248c0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
248d0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
248e0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
248f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d  );.  assert( (v-
24900 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
24910 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d  ITE_EnableQPSG)=
24920 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  =0 );.  if( iVar
24930 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  >=32 ){.    v->e
24940 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30  xpmask |= 0x8000
24950 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  0000;.  }else{. 
24960 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
24970 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
24980 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  r-1));.  }.}../*
24990 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63  .** Cause a func
249a0 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e  tion to throw an
249b0 20 65 72 72 6f 72 20 69 66 20 69 74 20 77 61 73   error if it was
249c0 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75   call from OP_Pu
249d0 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72  reFunc.** rather
249e0 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f   than OP_Functio
249f0 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65  n..**.** OP_Pure
24a00 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20  Func means that 
24a10 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  the function mus
24a20 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74  t be determinist
24a30 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ic, and should.*
24a40 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * throw an error
24a50 20 69 66 20 69 74 20 69 73 20 67 69 76 65 6e 20   if it is given 
24a60 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c  inputs that woul
24a70 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65  d make it non-de
24a80 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20  terministic..** 
24a90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24aa0 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f  invoked by date/
24ab0 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  time functions t
24ac0 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65  hat use non-dete
24ad0 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61  rministic.** fea
24ae0 74 75 72 65 73 20 73 75 63 68 20 61 73 20 27 6e  tures such as 'n
24af0 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ow'..*/.int sqli
24b00 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73  te3NotPureFunc(s
24b10 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
24b20 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pCtx){.#ifdef SQ
24b30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
24b40 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
24b50 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20   pCtx->pVdbe==0 
24b60 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64  ) return 1;.#end
24b70 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70  if.  if( pCtx->p
24b80 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e  Vdbe->aOp[pCtx->
24b90 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  iOp].opcode==OP_
24ba0 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20  PureFunc ){.    
24bb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
24bc0 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
24bd0 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e     "non-determin
24be0 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69  istic function i
24bf0 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  n index expressi
24c00 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73  on or CHECK cons
24c10 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20  traint",.       
24c20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
24c30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
24c40 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
24c50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
24c60 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
24c70 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
24c80 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
24c90 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
24ca0 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
24cb0 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
24cc0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
24cd0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
24ce0 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
24cf0 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
24d00 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
24d10 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
24d20 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
24d30 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
24d40 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
24d50 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
24d60 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28  b *pVtab){.  if(
24d70 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
24d80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
24d90 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
24da0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24db0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
24dc0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
24dd0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
24de0 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
24df0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
24e00 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
24e10 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62  rMsg);.    pVtab
24e20 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
24e30 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
24e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24e50 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
24e60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24e70 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
24e80 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  ./*.** If the se
24e90 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
24ea0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61   not NULL, relea
24eb0 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f  se any allocatio
24ec0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  ns associated .*
24ed0 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72  * with the memor
24ee0 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  y cells in the p
24ef0 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20  ->aMem[] array. 
24f00 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e  Also free the Un
24f10 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
24f20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
24f30 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  , using sqlite3D
24f40 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  bFree()..**.** T
24f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24f60 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70  used to free Unp
24f70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
24f80 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64  ctures allocated
24f90 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55   by.** the vdbeU
24fa0 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
24fb0 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20  nction found in 
24fc0 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74  vdbeapi.c..*/.st
24fd0 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
24fe0 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74  eeUnpacked(sqlit
24ff0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65  e3 *db, int nFie
25000 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ld, UnpackedReco
25010 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
25020 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
25030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69    for(i=0; i<nFi
25040 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
25050 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
25060 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  >aMem[i];.      
25070 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
25080 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
25090 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
250a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
250b0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
250c0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
250d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
250e0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
250f0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
25100 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
25110 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e  TE_HOOK./*.** In
25120 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
25130 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
25140 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
25150 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
25160 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
25170 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
25180 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
25190 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
251a0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
251b0 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
251c0 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
251d0 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
251e0 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
251f0 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
25200 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
25210 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
25220 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
25230 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
25240 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
25250 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
25260 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
25270 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25290 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
252a0 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
252b0 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
252c0 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
252d0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
252e0 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
252f0 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
25300 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
25330 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
25340 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
25350 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
25360 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
25370 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
25380 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253a0 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
253b0 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
253e0 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
253f0 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
25420 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
25430 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25440 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
25450 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
25460 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
25470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
25480 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
25490 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
254a0 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20  8 fakeSortOrder 
254b0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
254c0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
254d0 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
254e0 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
254f0 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
25500 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
25510 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pTab)==0 ){.    
25520 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20  iKey1 = iKey2 = 
25530 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74 65  0;.    preupdate
25540 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  .pPk = sqlite3Pr
25550 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
25560 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
25570 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
25580 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
25590 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
255a0 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20  [iReg].u.i;.    
255b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65  }else{.      iKe
255c0 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20  y2 = iKey1;.    
255d0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
255e0 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70   pCsr->nField==p
255f0 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20  Tab->nCol .     
25600 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65    || (pCsr->nFie
25610 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ld==pTab->nCol+1
25620 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   && op==SQLITE_D
25630 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d  ELETE && iReg==-
25640 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70  1).  );..  preup
25650 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72  date.v = v;.  pr
25660 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70  eupdate.pCsr = p
25670 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Csr;.  preupdate
25680 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75  .op = op;.  preu
25690 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20  pdate.iNewReg = 
256a0 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74  iReg;.  preupdat
256b0 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64  e.keyinfo.db = d
256c0 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  b;.  preupdate.k
256d0 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43  eyinfo.enc = ENC
256e0 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74  (db);.  preupdat
256f0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
25700 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  eld = pTab->nCol
25710 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
25720 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yinfo.aSortOrder
25730 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72   = (u8*)&fakeSor
25740 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64  tOrder;.  preupd
25750 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79  ate.iKey1 = iKey
25760 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  1;.  preupdate.i
25770 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20  Key2 = iKey2;.  
25780 70 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d  preupdate.pTab =
25790 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50   pTab;..  db->pP
257a0 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75  reUpdate = &preu
257b0 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72  pdate;.  db->xPr
257c0 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  eUpdateCallback(
257d0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
257e0 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20  g, db, op, zDb, 
257f0 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65  zTbl, iKey1, iKe
25800 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  y2);.  db->pPreU
25810 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pdate = 0;.  sql
25820 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25830 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64  reupdate.aRecord
25840 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
25850 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
25860 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
25870 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
25880 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
25890 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
258a0 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
258b0 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
258c0 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
258d0 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
258e0 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
258f0 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
25900 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25910 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
25920 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
25930 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
25940 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
25950 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
25960 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
25970 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  b, preupdate.aNe
25980 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  w);.  }.}.#endif
25990 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
259a0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
259b0 20 2a 2f 0a                                       */.