/ Hex Artifact Content
Login

Artifact c2d65c763b0811afe409e02e9d0d1f300c6e97892474fc94eec3da71955cd418:


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 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20    int jj, kk;.  
15c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
15d0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  = p->pParse;.   
15e0: 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a   for(jj=kk=0; jj
15f0: 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1600: 68 65 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  he; jj++){.     
1610: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1620: 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61  e *x = pParse->a
1630: 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20  ColCache + jj;. 
1640: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1650: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1660: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
1670: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
1680: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
1690: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
16a0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
16b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
16c0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
16d0: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
16e0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
16f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1700: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1710: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1720: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1730: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1740: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1750: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1760: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
1770: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1780: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1790: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
17a0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
17b0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
17c0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
17d0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
17e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
17f0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1800: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1820: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1830: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1850: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1860: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1880: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1890: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
18a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18b0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
18c0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
18d0: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
18e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
18f0: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1900: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1910: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1920: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1930: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1940: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1950: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1960: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
1970: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
1980: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
1990: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
19a0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
19b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
19c0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
19d0: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
19e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19f0: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1a00: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1a10: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1a20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1a30: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1a40: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1a50: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1a60: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
1a70: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
1a80: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
1a90: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
1aa0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
1ab0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
1ac0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1ad0: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1ae0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1af0: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1b00: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1b10: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b20: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1b30: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1b40: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1b50: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1b60: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1b70: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1b80: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1b90: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ba0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1bb0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1bc0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1bd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  **.** If the inp
1be0: 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e  ut string does n
1bf0: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58 22 20  ot end with "X" 
1c00: 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c  then an OP_Resul
1c10: 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  tRow instruction
1c20: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
1c30: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20   for the values 
1c40: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69  inserted..*/.voi
1c50: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c  d sqlite3VdbeMul
1c60: 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20  tiLoad(Vdbe *p, 
1c70: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74  int iDest, const
1c80: 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e   char *zTypes, .
1c90: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1ca0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
1cb0: 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  ar c;.  va_start
1cc0: 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20  (ap, zTypes);.  
1cd0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54  for(i=0; (c = zT
1ce0: 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  ypes[i])!=0; i++
1cf0: 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73  ){.    if( c=='s
1d00: 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ' ){.      const
1d10: 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72   char *z = va_ar
1d20: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1d30: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
1d40: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a  3VdbeAddOp4(p, z
1d50: 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20  ==0 ? OP_Null : 
1d60: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69  OP_String8, 0, i
1d70: 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29  Dest+i, 0, z, 0)
1d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d90: 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20  c=='i' ){.      
1da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db0: 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(p, OP_Integer,
1dc0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1dd0: 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20  , iDest+i);.    
1de0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
1df0: 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74  o skip_op_result
1e00: 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  row;.    }.  }. 
1e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e20: 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(p, OP_ResultR
1e30: 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73  ow, iDest, i);.s
1e40: 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77  kip_op_resultrow
1e50: 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  :.  va_end(ap);.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1e70: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1e80: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1e90: 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a  e as a pointer..
1ea0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1eb0: 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65  beAddOp4(.  Vdbe
1ec0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1ed0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
1ee0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
1ef0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
1f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1f10: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1f20: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
1f30: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
1f40: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f60: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
1f70: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
1f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1f90: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
1fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
1fb0: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1fc0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74  and */.  int p4t
1fd0: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ype          /* 
1fe0: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20  P4 operand type 
1ff0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
2000: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2010: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
2020: 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74  p2, p3);.  sqlit
2030: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
2040: 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74  , addr, zP4, p4t
2050: 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ype);.  return a
2060: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ddr;.}../*.** Ad
2070: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
2080: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
2090: 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 50 34   value with a P4
20a0: 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f  _INT64 or.** P4_
20b0: 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e  REAL type..*/.in
20c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
20d0: 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62 65 20  Op4Dup8(.  Vdbe 
20e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
20f0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
2100: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2110: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2120: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2130: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
2140: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
2150: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
2160: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2180: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
2190: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
21a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
21b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
21c0: 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20  st u8 *zP4,     
21d0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
21e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  nd */.  int p4ty
21f0: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  pe          /* P
2200: 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a  4 operand type *
2210: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63  /.){.  char *p4c
2220: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  opy = sqlite3DbM
2230: 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74  allocRawNN(sqlit
2240: 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b  e3VdbeDb(p), 8);
2250: 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29 20  .  if( p4copy ) 
2260: 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a  memcpy(p4copy, z
2270: 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e  P4, 8);.  return
2280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2290: 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p4(p, op, p1, p2
22a0: 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34  , p3, p4copy, p4
22b0: 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  type);.}..#ifnde
22c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
22d0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PLAIN./*.** Retu
22e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
22f0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 45 58  f the current EX
2300: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2310: 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20   baseline..** 0 
2320: 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f  means "none"..*/
2330: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2340: 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 61  ExplainParent(Pa
2350: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2360: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
2370: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  f( pParse->addrE
2380: 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75  xplain==0 ) retu
2390: 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71  rn 0;.  pOp = sq
23a0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
23b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
23c0: 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69  arse->addrExplai
23d0: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70  n);.  return pOp
23e0: 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ->p2;.}../*.** A
23f0: 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78 70 6c  dd a new OP_Expl
2400: 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ain opcode..**.*
2410: 2a 20 49 66 20 74 68 65 20 62 50 75 73 68 20 66  * If the bPush f
2420: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
2430: 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70 63 6f  n make this opco
2440: 64 65 20 74 68 65 20 70 61 72 65 6e 74 20 66 6f  de the parent fo
2450: 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20  r.** subsequent 
2460: 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c 20 73  Explains until s
2470: 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69  qlite3VdbeExplai
2480: 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c 65 64  nPop() is called
2490: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24a0: 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50 61 72  3VdbeExplain(Par
24b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38 20 62  se *pParse, u8 b
24c0: 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  Push, const char
24d0: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
24e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
24f0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
2500: 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64  ar *zMsg;.    Vd
2510: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2520: 70 56 64 62 65 3b 0a 20 20 20 20 76 61 5f 6c 69  pVdbe;.    va_li
2530: 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69  st ap;.    int i
2540: 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61  This;.    va_sta
2550: 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
2560: 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
2570: 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  VMPrintf(pParse-
2580: 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a  >db, zFmt, ap);.
2590: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
25a0: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
25b0: 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73  pVdbe;.    iThis
25c0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73   = v->nOp;.    s
25d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25e0: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
25f0: 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61  iThis, pParse->a
2600: 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20  ddrExplain, 0,. 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59       zMsg, P4_DY
2630: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66 28 20  NAMIC);.    if( 
2640: 62 50 75 73 68 29 20 70 50 61 72 73 65 2d 3e 61  bPush) pParse->a
2650: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69 54 68  ddrExplain = iTh
2660: 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  is;.  }.}../*.**
2670: 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41 49 4e   Pop the EXPLAIN
2680: 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74 61 63   QUERY PLAN stac
2690: 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  k one level..*/.
26a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
26b0: 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 65  ExplainPop(Parse
26c0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
26d0: 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  rse->addrExplain
26e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
26f0: 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72  plainParent(pPar
2700: 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  se);.}.#endif /*
2710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2720: 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  LAIN */../*.** A
2730: 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63  dd an OP_ParseSc
2740: 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68  hema opcode.  Th
2750: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72  is routine is br
2760: 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a  oken out from.**
2770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2780: 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65  p4() since it ne
2790: 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64  eds to also need
27a0: 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74  s to mark all bt
27b0: 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e  rees.** as havin
27c0: 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a  g been used..**.
27d0: 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74  ** The zWhere st
27e0: 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62  ring must have b
27f0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
2800: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
2810: 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ()..** This rout
2820: 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77  ine will take ow
2830: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61  nership of the a
2840: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
2850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2860: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
2870: 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  maOp(Vdbe *p, in
2880: 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68  t iDb, char *zWh
2890: 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  ere){.  int j;. 
28a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28b0: 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63  p4(p, OP_ParseSc
28c0: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c  hema, iDb, 0, 0,
28d0: 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41   zWhere, P4_DYNA
28e0: 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  MIC);.  for(j=0;
28f0: 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a   j<p->db->nDb; j
2900: 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55  ++) sqlite3VdbeU
2910: 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a  sesBtree(p, j);.
2920: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
2930: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
2940: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
2950: 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  e as an integer.
2960: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2970: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
2980: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
2990: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
29a0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
29b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
29c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29d0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
29e0: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
29f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
2a00: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2a10: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
2a20: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
2a30: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
2a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a50: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
2a60: 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20    int p4        
2a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20        /* The P4 
2a80: 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e  operand as an in
2a90: 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  teger */.){.  in
2aa0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
2ab0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
2ac0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
2ad0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
2ae0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
2af0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
2b00: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
2b10: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
2b20: 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20  = P4_INT32;.    
2b30: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a  pOp->p4.i = p4;.
2b40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
2b50: 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20  r;.}../* Insert 
2b60: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d  the end of a co-
2b70: 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20  routine.*/.void 
2b80: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
2b90: 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c  routine(Vdbe *v,
2ba0: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a   int regYield){.
2bb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bc0: 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
2bd0: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
2be0: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74  );..  /* Clear t
2bf0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  he temporary reg
2c00: 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65  ister cache, the
2c10: 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68  reby ensuring th
2c20: 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d  at each.  ** co-
2c30: 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20  routine has its 
2c40: 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20  own independent 
2c50: 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73  set of registers
2c60: 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75  , because co-rou
2c70: 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74  tines.  ** might
2c80: 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65   expect their re
2c90: 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72  gisters to be pr
2ca0: 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61  eserved across a
2cb0: 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a  n OP_Yield, and.
2cc0: 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20    ** that could 
2cd0: 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69  cause problems i
2ce0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f  f two or more co
2cf0: 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73  -routines are us
2d00: 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a  ing the same.  *
2d10: 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  * temporary regi
2d20: 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e  ster..  */.  v->
2d30: 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2d40: 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73   = 0;.  v->pPars
2d50: 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
2d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2d70: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
2d80: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
2d90: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
2da0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
2db0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
2dc0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
2dd0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
2de0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
2df0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
2e00: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
2e10: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
2e20: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
2e30: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
2e40: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
2e50: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
2e60: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
2e70: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
2e80: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
2e90: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
2ea0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
2eb0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
2ec0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
2ed0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
2ee0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
2ef0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
2f00: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
2f10: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
2f20: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
2f30: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
2f40: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
2f50: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
2f60: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
2f70: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
2f80: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2f90: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
2fa0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
2fb0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
2fc0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
2fd0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
2fe0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
2ff0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
3000: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
3010: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
3020: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
3030: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
3040: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3050: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
3060: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
3070: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
3080: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
3090: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
30a0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
30e0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
30f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
3100: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
3110: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
3120: 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52 28  }.  return ADDR(
3130: 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  i);.}../*.** Res
3140: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
3150: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
3160: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3170: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
3180: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
3190: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
31a0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
31b0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
31c0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
31d0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31e0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
31f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3200: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3210: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3220: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3230: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3250: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3260: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3270: 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20  rt( j<p->nLabel 
3280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
3290: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  0 );.  if( p->aL
32a0: 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66 20 53  abel ){.#ifdef S
32b0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
32c0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
32d0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
32e0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
32f0: 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c 56    printf("RESOLV
3300: 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 64  E LABEL %d to %d
3310: 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b  \n", x, v->nOp);
3320: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3330: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c 61    assert( p->aLa
3340: 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20  bel[j]==(-1) ); 
3350: 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20 6f 6e  /* Labels may on
3360: 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64 20 6f  ly be resolved o
3370: 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c  nce */.    p->aL
3380: 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70  abel[j] = v->nOp
3390: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
33a0: 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
33b0: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TEST./*.** Retur
33c0: 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e  n TRUE if and on
33d0: 6c 79 20 69 66 20 74 68 65 20 6c 61 62 65 6c 20  ly if the label 
33e0: 78 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  x has already be
33f0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 20  en resolved..** 
3400: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 28 7a 65  Return FALSE (ze
3410: 72 6f 29 20 69 66 20 6c 61 62 65 6c 20 78 20 69  ro) if label x i
3420: 73 20 73 74 69 6c 6c 20 75 6e 72 65 73 6f 6c 76  s still unresolv
3430: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
3440: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
3450: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74 65  sed inside of te
3460: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 2c  stcase() macros,
3470: 20 61 6e 64 20 73 6f 20 69 74 0a 2a 2a 20 6f 6e   and so it.** on
3480: 6c 79 20 65 78 69 73 74 73 20 77 68 65 6e 20 6d  ly exists when m
3490: 65 61 73 75 72 69 6e 67 20 74 65 73 74 20 63 6f  easuring test co
34a0: 76 65 72 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  verage..*/.int s
34b0: 71 6c 69 74 65 33 56 64 62 65 4c 61 62 65 6c 48  qlite3VdbeLabelH
34c0: 61 73 42 65 65 6e 52 65 73 6f 6c 76 65 64 28 56  asBeenResolved(V
34d0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a  dbe *v, int x){.
34e0: 20 20 72 65 74 75 72 6e 20 76 2d 3e 70 50 61 72    return v->pPar
34f0: 73 65 2d 3e 61 4c 61 62 65 6c 20 26 26 20 76 2d  se->aLabel && v-
3500: 3e 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 5b  >pParse->aLabel[
3510: 41 44 44 52 28 78 29 5d 3e 3d 30 3b 0a 7d 0a 23  ADDR(x)]>=0;.}.#
3520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3530: 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f  COVERAGE_TEST */
3540: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
3550: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
3560: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
3570: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
3580: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
3590: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
35a0: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
35b0: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  yOnce = 1;.}../*
35c0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
35d0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
35e0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75  n only be run mu
35f0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f  ltiple times..*/
3600: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3610: 65 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a  eReusable(Vdbe *
3620: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3630: 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  Once = 0;.}..#if
3640: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3650: 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72   /* sqlite3Asser
3660: 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69  tMayAbort() logi
3670: 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c */../*.** The 
3680: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61  following type a
3690: 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  nd function are 
36a0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
36b0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
36c0: 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65  des.** in a Vdbe
36d0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e   main program an
36e0: 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75  d each of the su
36f0: 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67  b-programs (trig
3700: 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a  gers) it may .**
3710: 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79   invoke directly
3720: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   or indirectly. 
3730: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  It should be use
3740: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
3750: 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a  .**   Op *pOp;.*
3760: 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  *   VdbeOpIter s
3770: 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65  Iter;.**.**   me
3780: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3790: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
37a0: 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76  **   sIter.v = v
37b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
37d0: 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62  v is of type Vdb
37e0: 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20  e* .**   while( 
37f0: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
3800: 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a  t(&sIter)) ){.**
3810: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
3820: 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a  hing with pOp.**
3830: 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65     }.**   sqlite
3840: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
3850: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20  Iter.apSub);.** 
3860: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3870: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64  ct VdbeOpIter Vd
3880: 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74  beOpIter;.struct
3890: 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20   VdbeOpIter {.  
38a0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
38b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
38c0: 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  be to iterate th
38d0: 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65  rough the opcode
38e0: 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f  s of */.  SubPro
38f0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20  gram **apSub;   
3900: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
3910: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
3920: 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20    int nSub;     
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3940: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
3950: 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20  s in apSub */.  
3960: 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20  int iAddr;      
3970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
3980: 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e  dress of next in
3990: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74  struction to ret
39a0: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  urn */.  int iSu
39b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
39c0: 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20      /* 0 = main 
39d0: 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72  program, 1 = fir
39e0: 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65  st sub-program e
39f0: 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  tc. */.};.static
3a00: 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28   Op *opIterNext(
3a10: 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a  VdbeOpIter *p){.
3a20: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76    Vdbe *v = p->v
3a30: 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30  ;.  Op *pRet = 0
3a40: 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69  ;.  Op *aOp;.  i
3a50: 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70  nt nOp;..  if( p
3a60: 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20  ->iSub<=p->nSub 
3a70: 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ){..    if( p->i
3a80: 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sub==0 ){.      
3a90: 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20  aOp = v->aOp;.  
3aa0: 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70      nOp = v->nOp
3ab0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3ac0: 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75     aOp = p->apSu
3ad0: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f  b[p->iSub-1]->aO
3ae0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70  p;.      nOp = p
3af0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
3b00: 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  1]->nOp;.    }. 
3b10: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41     assert( p->iA
3b20: 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20  ddr<nOp );..    
3b30: 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69  pRet = &aOp[p->i
3b40: 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41  Addr];.    p->iA
3b50: 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  ddr++;.    if( p
3b60: 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a  ->iAddr==nOp ){.
3b70: 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b        p->iSub++;
3b80: 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20  .      p->iAddr 
3b90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
3ba0: 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79    if( pRet->p4ty
3bb0: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
3bc0: 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  M ){.      int n
3bd0: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b  Byte = (p->nSub+
3be0: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
3bf0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e  gram*);.      in
3c00: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
3c10: 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a  =0; j<p->nSub; j
3c20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
3c30: 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52   p->apSub[j]==pR
3c40: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  et->p4.pProgram 
3c50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
3c60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d  .      if( j==p-
3c70: 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  >nSub ){.       
3c80: 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69   p->apSub = sqli
3c90: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
3ca0: 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53  ee(v->db, p->apS
3cb0: 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ub, nByte);.    
3cc0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75      if( !p->apSu
3cd0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  b ){.          p
3ce0: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Ret = 0;.       
3cf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3d00: 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53    p->apSub[p->nS
3d10: 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34  ub++] = pRet->p4
3d20: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
3d30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d40: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3d50: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
3d60: 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f  Check if the pro
3d70: 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74  gram stored in t
3d80: 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64  he VM associated
3d90: 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79   with pParse may
3da0: 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f  .** throw an ABO
3db0: 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61  RT exception (ca
3dc0: 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  using the statem
3dd0: 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74  ent, but not ent
3de0: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ire transaction.
3df0: 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ** to be rolled 
3e00: 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64  back). This cond
3e10: 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ition is true if
3e20: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
3e30: 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d  m or any.** sub-
3e40: 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e  programs contain
3e50: 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  s any of the fol
3e60: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
3e70: 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20  *  OP_Halt with 
3e80: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
3e90: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
3ea0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
3eb0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68  _HaltIfNull with
3ec0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
3ed0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
3ee0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
3ef0: 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a  P_Destroy.**   *
3f00: 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20    OP_VUpdate.** 
3f10: 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a    *  OP_VRename.
3f20: 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75  **   *  OP_FkCou
3f30: 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20  nter with P2==0 
3f40: 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
3f50: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
3f60: 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72  t).**   *  OP_Cr
3f70: 65 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f  eateBtree/BTREE_
3f80: 49 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e  INTKEY and OP_In
3f90: 69 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  itCoroutine .** 
3fa0: 20 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45       (for CREATE
3fb0: 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54   TABLE AS SELECT
3fc0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...).**.** Then
3fd0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
3fe0: 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d  value of Parse.m
3ff0: 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20  ayAbort is true 
4000: 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d  if an.** ABORT m
4010: 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72  ay be thrown, or
4020: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
4030: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  . Return true if
4040: 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63   it does.** matc
4050: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
4060: 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63  rwise. This func
4070: 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64  tion is intended
4080: 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a   to be used as.*
4090: 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  * part of an ass
40a0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ert statement in
40b0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53   the compiler. S
40c0: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
40d0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
40e0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
40f0: 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64  bort(pParse->pVd
4100: 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41  be, pParse->mayA
4110: 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20  bort) );.*/.int 
4120: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
4130: 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a  tMayAbort(Vdbe *
4140: 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29  v, int mayAbort)
4150: 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74  {.  int hasAbort
4160: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46   = 0;.  int hasF
4170: 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  kCounter = 0;.  
4180: 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62  int hasCreateTab
4190: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  le = 0;.  int ha
41a0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
41b0: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
41c0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
41d0: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
41e0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
41f0: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
4200: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
4210: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
4220: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
4230: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
4240: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
4250: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
4260: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
4270: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
4280: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
4290: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
42a0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
42b0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
42c0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
42d0: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
42e0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
42f0: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
4300: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
4310: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
4320: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
4330: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4340: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4350: 43 72 65 61 74 65 42 74 72 65 65 20 26 26 20 70  CreateBtree && p
4360: 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e  Op->p3==BTREE_IN
4370: 54 4b 45 59 20 29 20 68 61 73 43 72 65 61 74 65  TKEY ) hasCreate
4380: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
4390: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
43a0: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
43b0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
43c0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
43d0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
43e0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
43f0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
4400: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
4410: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
4420: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
4430: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
4440: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
4450: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
4460: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
4470: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
4480: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
4490: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
44a0: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
44b0: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
44c0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
44d0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
44e0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
44f0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
4500: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
4510: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
4520: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
4530: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
4540: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
4550: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
4560: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
4570: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
4580: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
4590: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
45a0: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
45b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
45c0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
45d0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
45e0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
45f0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
4600: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
4610: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
4620: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4630: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
4640: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
4650: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
4660: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
4670: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e  E_DEBUG./*.** In
4680: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69  crement the nWri
4690: 74 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68  te counter in th
46a0: 65 20 56 44 42 45 20 69 66 20 74 68 65 20 63 75  e VDBE if the cu
46b0: 72 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a  rsor is not an.*
46c0: 2a 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  * ephemeral curs
46d0: 6f 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75  or, or if the cu
46e0: 72 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73  rsor argument is
46f0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
4700: 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
4710: 69 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20  iteCounter(Vdbe 
4720: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
4730: 70 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30  pC){.  if( pC==0
4740: 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72  .   || (pC->eCur
4750: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f  Type!=CURTYPE_SO
4760: 52 54 45 52 0a 20 20 20 20 20 20 20 26 26 20 70  RTER.       && p
4770: 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
4780: 54 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20  TYPE_PSEUDO.    
4790: 20 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68     && !pC->isEph
47a0: 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20  emeral).  ){.   
47b0: 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20   p->nWrite++;.  
47c0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
47d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
47e0: 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20  /*.** Assert if 
47f0: 61 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69 73  an Abort at this
4800: 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d   point in time m
4810: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
4820: 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61   corrupt.** data
4830: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
4840: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
4850: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
4860: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4870: 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e  nWrite==0 || p->
4880: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
4890: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
48a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
48b0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
48c0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
48d0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
48e0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
48f0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
4900: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
4910: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
4920: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
4930: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
4940: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
4950: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
4960: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
4970: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
4980: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
4990: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
49a0: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
49b0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
49c0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
49d0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
49e0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
49f0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
4a00: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
4a10: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
4a20: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
4a30: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
4a40: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
4a50: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
4a60: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
4a70: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
4a80: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
4a90: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
4aa0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
4ab0: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
4ac0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
4ad0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
4ae0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
4af0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
4b00: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
4b10: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
4b20: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
4b30: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
4b40: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
4b50: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
4b60: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
4b70: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
4b80: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
4b90: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
4ba0: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
4bb0: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
4bc0: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
4bd0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
4be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
4bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
4c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
4c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
4c20: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
4c30: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
4c40: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
4c50: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
4c60: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
4c70: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
4c80: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
4c90: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
4ca0: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
4cb0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
4cc0: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
4cd0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
4ce0: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
4cf0: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
4d00: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
4d10: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
4d20: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
4d30: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
4d40: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
4d50: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
4d60: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
4d70: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
4d80: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
4d90: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
4da0: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
4db0: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
4dc0: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
4dd0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
4de0: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
4df0: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
4e00: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
4e10: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
4e20: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
4e30: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
4e40: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
4e50: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
4e60: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
4e70: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
4e80: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
4e90: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
4ea0: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
4eb0: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
4ec0: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
4ed0: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
4ee0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
4ef0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
4f00: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
4f10: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4f20: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
4f30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
4f40: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
4f50: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
4f60: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
4f70: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
4f80: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
4f90: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
4fa0: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
4fb0: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
4fc0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
4fd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
4fe0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
4ff0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5000: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
5010: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
5020: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
5030: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
5040: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
5050: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
5060: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
5070: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
5080: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
5090: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
50a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
50b0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
50c0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
50d0: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
50e0: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
50f0: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
5100: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
5110: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
5120: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5130: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
5140: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
5150: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
5160: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
5170: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5180: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5190: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
51a0: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
51b0: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
51c0: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
51d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
51e0: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
51f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5200: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
5210: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5230: 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a  case OP_Prev: {.
5240: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5250: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
5260: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
5270: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
5280: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
5290: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
52a0: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e   /* The code gen
52b0: 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64  erator never cod
52c0: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  es any of these 
52d0: 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d  opcodes as a jum
52e0: 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  p.          ** t
52f0: 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79  o a label.  They
5300: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65   are always code
5310: 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b  d as a jump back
5320: 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20  wards to a .    
5330: 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61        ** known a
5340: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ddress */.      
5350: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5360: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  >p2>=0 );.      
5370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5380: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
5390: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
53a0: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61  TABLE.        ca
53b0: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
53c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
53d0: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
53e0: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
53f0: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
5400: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5410: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5420: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
5430: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
5440: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5450: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d  pOp - p->aOp) >=
5460: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3 );.          
5470: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
5480: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
5490: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er );.          
54a0: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
54b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e            if( n>
54c0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
54d0: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
54e0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
54f0: 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61  gh into the defa
5500: 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ult case */.    
5510: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5520: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5530: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
5540: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
5550: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b         /* The mk
5560: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69  opcodeh.tcl scri
5570: 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67  pt has so arrang
5580: 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74  ed things that t
5590: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  he only.        
55a0: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
55b0: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
55c0: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
55d0: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
55e0: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  teed to.        
55f0: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5600: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
5610: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
5620: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5630: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5640: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5650: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
5660: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
5670: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
5680: 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d  pOp->p2)<pParse-
5690: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
56a0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
56b0: 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70   aLabel[ADDR(pOp
56c0: 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20  ->p2)];.        
56d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
56e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
56f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
5700: 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63  The mkopcodeh.tc
5710: 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20  l script has so 
5720: 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20  arranged things 
5730: 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20  that the only.  
5740: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
5750: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
5760: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5770: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5780: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  teed to.      **
5790: 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69   have non-negati
57a0: 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32  ve values for P2
57b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
57c0: 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  t( (sqlite3Opcod
57d0: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f  eProperty[pOp->o
57e0: 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d  pcode]&OPFLG_JUM
57f0: 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32  P)==0 || pOp->p2
5800: 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >=0);.    }.    
5810: 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20  if( pOp==p->aOp 
5820: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70  ) break;.    pOp
5830: 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  --;.  }.  sqlite
5840: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
5850: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a  Parse->aLabel);.
5860: 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c    pParse->aLabel
5870: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
5880: 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70  nLabel = 0;.  *p
5890: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
58a0: 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74  axArgs;.  assert
58b0: 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d  ( p->bIsReader!=
58c0: 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  0 || DbMaskAllZe
58d0: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
58e0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
58f0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
5900: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
5910: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
5920: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
5930: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5940: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
5950: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5960: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5970: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
5980: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
5990: 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20   Verify that at 
59a0: 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73  least N opcode s
59b0: 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62  lots are availab
59c0: 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a  le in p without.
59d0: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c  ** having to mal
59e0: 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61  loc for more spa
59f0: 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20  ce (except when 
5a00: 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a  compiled using.*
5a10: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  * SQLITE_TEST_RE
5a20: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20  ALLOC_STRESS).  
5a30: 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69  This interface i
5a40: 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
5a50: 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69  sting.** to veri
5a60: 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  fy that certain 
5a70: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
5a80: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
5a90: 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69  can never.** fai
5aa0: 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66  l due to a OOM f
5ab0: 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74  ault and hence t
5ac0: 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76  hat the return v
5ad0: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  alue from.** sql
5ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5af0: 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  t() will always 
5b00: 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a  be non-NULL..*/.
5b10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5b20: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
5b30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
5b40: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
5b50: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
5b60: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5b70: 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70  Required(Vdbe *p
5b80: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
5b90: 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c  rt( p->nOp + N <
5ba0: 3d 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  = p->pParse->nOp
5bb0: 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69  Alloc );.}.#endi
5bc0: 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  f../*.** Verify 
5bd0: 74 68 61 74 20 74 68 65 20 56 4d 20 70 61 73 73  that the VM pass
5be0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
5bf0: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
5c00: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f   contain.** an O
5c10: 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
5c20: 64 65 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65  de. Fail an asse
5c30: 72 74 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e  rt() if it does.
5c40: 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a   This is used.**
5c50: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67   by code in prag
5c60: 6d 61 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74  ma.c to ensure t
5c70: 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  hat the implemen
5c80: 74 61 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69  tation of certai
5c90: 6e 0a 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d  n.** pragmas com
5ca0: 70 6f 72 74 73 20 77 69 74 68 20 74 68 65 20 66  ports with the f
5cb0: 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20 69  lags specified i
5cc0: 6e 20 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61  n the mkpragmata
5cd0: 62 2e 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e  b.tcl.** script.
5ce0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
5cf0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
5d00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5d10: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
5d20: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74  RESS).void sqlit
5d30: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65  e3VdbeVerifyNoRe
5d40: 73 75 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29  sultRow(Vdbe *p)
5d50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5d60: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
5d70: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
5d80: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  ( p->aOp[i].opco
5d90: 64 65 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77  de!=OP_ResultRow
5da0: 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   );.  }.}.#endif
5db0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5dc0: 20 63 6f 64 65 20 28 61 20 73 69 6e 67 6c 65 20   code (a single 
5dd0: 4f 50 5f 41 62 6f 72 74 61 62 6c 65 20 6f 70 63  OP_Abortable opc
5de0: 6f 64 65 29 20 74 68 61 74 20 77 69 6c 6c 0a 2a  ode) that will.*
5df0: 2a 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  * verify that th
5e00: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 63  e VDBE program c
5e10: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 20 41  an safely call A
5e20: 62 6f 72 74 20 69 6e 20 74 68 65 20 63 75 72 72  bort in the curr
5e30: 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a  ent.** context..
5e40: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
5e50: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69  QLITE_DEBUG).voi
5e60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72  d sqlite3VdbeVer
5e70: 69 66 79 41 62 6f 72 74 61 62 6c 65 28 56 64 62  ifyAbortable(Vdb
5e80: 65 20 2a 70 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  e *p, int onErro
5e90: 72 29 7b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f  r){.  if( onErro
5ea0: 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 20 73 71  r==OE_Abort ) sq
5eb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
5ec0: 70 2c 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 29  p, OP_Abortable)
5ed0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5ee0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5ef0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
5f00: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
5f10: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
5f20: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
5f30: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
5f40: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5f50: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
5f60: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
5f70: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
5f80: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
5f90: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
5fa0: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
5fb0: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
5fc0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
5fd0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
5fe0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
5ff0: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
6000: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6010: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6020: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
6030: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
6040: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
6050: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
6060: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
6070: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
6080: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
6090: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
60a0: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
60b0: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
60c0: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
60d0: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
60e0: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
60f0: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
6100: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
6110: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
6120: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
6130: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
6140: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
6150: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
6160: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
6170: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
6180: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
6190: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
61a0: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
61b0: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
61c0: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
61d0: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
61e0: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
61f0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
6200: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
6210: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
6220: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
6230: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
6240: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
6250: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61  stack.  Return a
6260: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
6270: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
6280: 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  on inserted..**.
6290: 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61  ** Non-zero P2 a
62a0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70  rguments to jump
62b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
62c0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
62d0: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74  adjusted.** so t
62e0: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72  hat the jump tar
62f0: 67 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20  get is relative 
6300: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  to the first ope
6310: 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e  ration inserted.
6320: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
6330: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
6340: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6360: 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20   /* Add opcodes 
6370: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
6380: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
6390: 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20  nt nOp,         
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
63b0: 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73  umber of opcodes
63c0: 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62   to add */.  Vdb
63d0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
63e0: 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Op,       /* The
63f0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61   opcodes to be a
6400: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  dded */.  int iL
6410: 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20  ineno           
6420: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
6430: 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65  -file line numbe
6440: 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64  r of first opcod
6450: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
6460: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c  .  VdbeOp *pOut,
6470: 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65   *pFirst;.  asse
6480: 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61  rt( nOp>0 );.  a
6490: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
64a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
64b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
64c0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
64d0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
64e0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e  growOpArray(p, n
64f0: 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Op) ){.    retur
6500: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73  n 0;.  }.  pFirs
6510: 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  t = pOut = &p->a
6520: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f  Op[p->nOp];.  fo
6530: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
6540: 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b  +, aOp++, pOut++
6550: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  ){.    pOut->opc
6560: 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64  ode = aOp->opcod
6570: 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  e;.    pOut->p1 
6580: 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70  = aOp->p1;.    p
6590: 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70  Out->p2 = aOp->p
65a0: 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  2;.    assert( a
65b0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
65c0: 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63   if( (sqlite3Opc
65d0: 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d  odeProperty[aOp-
65e0: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
65f0: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70  _JUMP)!=0 && aOp
6600: 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20  ->p2>0 ){.      
6610: 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e  pOut->p2 += p->n
6620: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  Op;.    }.    pO
6630: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
6640: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
6650: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
6660: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
6670: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
6680: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
6690: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
66a0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
66b0: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
66c0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
66d0: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
66e0: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
66f0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
6700: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
6710: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
6720: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
6730: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
6740: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
6750: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
6760: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
6770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
6780: 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70  ntOp(0, i+p->nOp
6790: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e  , &p->aOp[i+p->n
67a0: 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Op]);.    }.#end
67b0: 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20  if.  }.  p->nOp 
67c0: 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e  += nOp;.  return
67d0: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20   pFirst;.}..#if 
67e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
67f0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
6800: 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64  TATUS)./*.** Add
6810: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
6820: 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65   array of counte
6830: 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71  rs managed by sq
6840: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
6850: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  tatus()..*/.void
6860: 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
6870: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
6880: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
68a0: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
68b0: 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s() to */.  int 
68c0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20  addrExplain,    
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
68e0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
68f0: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20  lain (or 0) */. 
6900: 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20   int addrLoop,  
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c   /* Address of l
6930: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a  oop counter */ .
6940: 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c    int addrVisit,
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
6970: 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75  rows visited cou
6980: 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  nter */.  LogEst
6990: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
69a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
69b0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
69c0: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
69d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
69e0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
69f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
6a00: 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
6a10: 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a  g scanned */.){.
6a20: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
6a30: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
6a40: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
6a50: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
6a60: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
6a70: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
6a80: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
6a90: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
6aa0: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
6ab0: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
6ac0: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
6ad0: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
6ae0: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
6af0: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
6b00: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
6b10: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
6b20: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
6b30: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
6b40: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
6b50: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
6b60: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
6b70: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
6b80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
6b90: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
6ba0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
6bb0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
6bc0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
6bd0: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
6be0: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
6bf0: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
6c00: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
6c10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6c20: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
6c30: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
6c40: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
6c50: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
6c60: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
6c70: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
6c80: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
6c90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
6ca0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
6cb0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
6cc0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
6cd0: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
6ce0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
6cf0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
6d00: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
6d10: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
6d20: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
6d30: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
6d40: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
6d50: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
6d60: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
6d70: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
6d80: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
6d90: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
6da0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6db0: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
6dc0: 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73  p, u16 p5){.  as
6dd0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
6de0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
6df0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
6e00: 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70  ->nOp>0 ) p->aOp
6e10: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
6e20: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  p5;.}../*.** Cha
6e30: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
6e40: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
6e50: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
6e60: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
6e70: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
6e80: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
6e90: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
6ea0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6eb0: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
6ec0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
6ed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6ee0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
6ef0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
6f00: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
6f10: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
6f20: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
6f30: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
6f40: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
6f50: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
6f60: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
6f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6f80: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
6f90: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
6fa0: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
6fb0: 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d  f){.  if( (pDef-
6fc0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
6fd0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
6fe0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6ff0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44  3DbFreeNN(db, pD
7000: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
7010: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
7020: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
7030: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
7040: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
7050: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
7060: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
7070: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
7080: 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73  void freeP4Mem(s
7090: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20  qlite3 *db, Mem 
70a0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  *p){.  if( p->sz
70b0: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
70c0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
70d0: 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65  alloc);.  sqlite
70e0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
70f0: 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54  ;.}.static SQLIT
7100: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
7110: 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71  freeP4FuncCtx(sq
7120: 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74  lite3 *db, sqlit
7130: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a  e3_context *p){.
7140: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
7150: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70  unction(db, p->p
7160: 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44  Func);. sqlite3D
7170: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
7180: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
7190: 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62  eeP4(sqlite3 *db
71a0: 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  , int p4type, vo
71b0: 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72  id *p4){.  asser
71c0: 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63  t( db );.  switc
71d0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
71e0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
71f0: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  : {.      freeP4
7200: 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c  FuncCtx(db, (sql
7210: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
7220: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7230: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7240: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65  4_REAL:.    case
7250: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63   P4_INT64:.    c
7260: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
7270: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
7280: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
7290: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
72a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
72b0: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
72c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
72d0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
72e0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
72f0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7300: 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 ) sqlite3KeyIn
7310: 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f  foUnref((KeyInfo
7320: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7330: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
7340: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7350: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
7360: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
7370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7380: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
7390: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  r*)p4);.      br
73a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
73b0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  f.    case P4_FU
73c0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66  NCDEF: {.      f
73d0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
73e0: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
73f0: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  f*)p4);.      br
7400: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7410: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
7420: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
7430: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20  tesFreed==0 ){. 
7440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
7450: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
7460: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
7470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7480: 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20    freeP4Mem(db, 
7490: 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20  (Mem*)p4);.     
74a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
74b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
74c0: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
74d0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
74e0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
74f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
7500: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
7510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7520: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
7530: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
7540: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
7550: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
7560: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
7570: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
7580: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
7590: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
75a0: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
75b0: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
75c0: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
75d0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
75e0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
75f0: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
7600: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
7610: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
7620: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
7630: 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f  =&aOp[nOp-1]; pO
7640: 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a  p>=aOp; pOp--){.
7650: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
7660: 34 74 79 70 65 20 3c 3d 20 50 34 5f 46 52 45 45  4type <= P4_FREE
7670: 5f 49 46 5f 4c 45 20 29 20 66 72 65 65 50 34 28  _IF_LE ) freeP4(
7680: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
7690: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
76a0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
76b0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
76c0: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
76d0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
76e0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
76f0: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20  f     .    }.   
7700: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7710: 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d  (db, aOp);.  }.}
7720: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
7730: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
7740: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
7750: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7760: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
7770: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
7780: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
7790: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
77a0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
77b0: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
77c0: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
77d0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
77e0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
77f0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
7800: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
7810: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
7820: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
7830: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
7840: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
7850: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
7860: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7870: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
7880: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69  nto OP_Noop.*/.i
7890: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
78a0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
78b0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
78c0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
78d0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
78e0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
78f0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   0;.  assert( ad
7900: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
7910: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
7920: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
7930: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
7940: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
7950: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
7960: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
7970: 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ED;.  pOp->p4.z 
7980: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  = 0;.  pOp->opco
7990: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
79a0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
79b0: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
79c0: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
79d0: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
79e0: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
79f0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
7a00: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
7a10: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
7a20: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
7a30: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
7a40: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
7a50: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
7a60: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
7a70: 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e   p->nOp>0 && p->
7a80: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70  aOp[p->nOp-1].op
7a90: 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  code==op ){.    
7aa0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
7ab0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
7ac0: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d  , p->nOp-1);.  }
7ad0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7ae0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7af0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
7b00: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
7b10: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
7b20: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
7b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7b40: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
7b50: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
7b60: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
7b70: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
7b80: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
7b90: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
7ba0: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
7bb0: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
7bc0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
7bd0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
7be0: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
7bf0: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
7c00: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
7c10: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
7c20: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
7c30: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
7c40: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
7c50: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
7c60: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
7c70: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
7c80: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
7c90: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
7ca0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
7cb0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
7cc0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
7cd0: 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f  of zP4..** .** O
7ce0: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
7cf0: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
7d00: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
7d10: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
7d20: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
7d30: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
7d40: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
7d50: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
7d60: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
7d70: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
7d80: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
7d90: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
7da0: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
7db0: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
7dc0: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
7dd0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7de0: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
7df0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
7e00: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49   void SQLITE_NOI
7e10: 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65  NLINE vdbeChange
7e20: 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a  P4Full(.  Vdbe *
7e30: 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20  p,.  Op *pOp,.  
7e40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
7e50: 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66  .  int n.){.  if
7e60: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
7e70: 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64  .    freeP4(p->d
7e80: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
7e90: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
7ea0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b  pOp->p4type = 0;
7eb0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
7ec0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c   0;.  }.  if( n<
7ed0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7ee0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
7ef0: 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61  (int)(pOp - p->a
7f00: 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  Op), zP4, n);.  
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
7f20: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
7f30: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
7f40: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
7f50: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
7f60: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
7f70: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7f80: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
7f90: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
7fa0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
7fb0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
7fc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
7fd0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
7fe0: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
7ff0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
8000: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
8010: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
8020: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
8030: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
8040: 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c  ert( p->aOp!=0 |
8050: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
8060: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
8070: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
8080: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
8090: 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  AB ) freeP4(db, 
80a0: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
80b0: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65  **)&zP4);.    re
80c0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
80d0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
80e0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
80f0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
8100: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
8110: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
8120: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
8130: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
8140: 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34   n>=0 || pOp->p4
8150: 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65  type ){.    vdbe
8160: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20  ChangeP4Full(p, 
8170: 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  pOp, zP4, n);.  
8180: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8190: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
81a0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
81b0: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
81c0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
81d0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
81e0: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
81f0: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
8200: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
8210: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
8220: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
8230: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
8240: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8250: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
8260: 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20  else if( zP4!=0 
8270: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
8280: 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 );.    pOp->p
8290: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
82a0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
82b0: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
82c0: 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50  )n;.    if( n==P
82d0: 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65 33  4_VTAB ) sqlite3
82e0: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
82f0: 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  *)zP4);.  }.}../
8300: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8310: 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P4 operand of th
8320: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8330: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
8340: 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c  n .** to the val
8350: 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ue defined by th
8360: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
8370: 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70 65  is is a high-spe
8380: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
8390: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
83a0: 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  geP4()..**.** Th
83b0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73  e P4 operand mus
83c0: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
83d0: 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e  previously defin
83e0: 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77  ed.  And the new
83f0: 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20  .** P4 must not 
8400: 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73  be P4_INT32.  Us
8410: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
8420: 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68 65  ngeP4() in eithe
8430: 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61  r of.** those ca
8440: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
8450: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
8460: 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a  (Vdbe *p, void *
8470: 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56  pP4, int n){.  V
8480: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  dbeOp *pOp;.  as
8490: 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33  sert( n!=P4_INT3
84a0: 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  2 && n!=P4_VTAB 
84b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d  );.  assert( n<=
84c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  0 );.  if( p->db
84d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
84e0: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
84f0: 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d  db, n, pP4);.  }
8500: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
8510: 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20  ( pP4!=0 );.    
8520: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
8530: 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70   );.    pOp = &p
8540: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
8550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
8560: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
8570: 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d  USED );.    pOp-
8580: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20  >p4type = n;.   
8590: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34   pOp->p4.p = pP4
85a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
85b0: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
85c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
85d0: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
85e0: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
85f0: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
8600: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8610: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
8620: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
8630: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
8640: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
8650: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79  se->pVdbe;.  Key
8660: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
8670: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
8680: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
8690: 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66  !=0 );.  pKeyInf
86a0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
86b0: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
86c0: 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70  , pIdx);.  if( p
86d0: 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65  KeyInfo ) sqlite
86e0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
86f0: 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45   pKeyInfo, P4_KE
8700: 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65  YINFO);.}..#ifde
8710: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8720: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
8730: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
8740: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
8750: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
8760: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
8770: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
8780: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
8790: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
87a0: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
87b0: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
87c0: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
87d0: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
87e0: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
87f0: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
8800: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
8810: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
8820: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
8830: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
8840: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
8850: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
8860: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
8870: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
8880: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
8890: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
88a0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
88b0: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
88c0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
88d0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
88e0: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
88f0: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
8900: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
8910: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
8920: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
8930: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
8940: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
8950: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
8960: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
8970: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
8980: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
8990: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
89a0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
89b0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
89c0: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
89d0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
89e0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
89f0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
8a00: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
8a10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
8a20: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
8a30: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
8a40: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
8a50: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
8a60: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
8a70: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
8a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8a90: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
8aa0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
8ab0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
8ac0: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
8ad0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
8ae0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
8af0: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
8b00: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
8b10: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
8b20: 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  RAGE./*.** Set t
8b30: 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  he value if the 
8b40: 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66  iSrcLine field f
8b50: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  or the previousl
8b60: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
8b70: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8b80: 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e  ite3VdbeSetLineN
8b90: 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69  umber(Vdbe *v, i
8ba0: 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c  nt iLine){.  sql
8bb0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
8bc0: 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  -1)->iSrcLine = 
8bd0: 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  iLine;.}.#endif 
8be0: 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  /* SQLITE_VDBE_C
8bf0: 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a  OVERAGE */../*.*
8c00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
8c10: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
8c20: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
8c30: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
8c40: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
8c50: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8c60: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
8c70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
8c80: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
8c90: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
8ca0: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
8cb0: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
8cc0: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
8cd0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
8ce0: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
8cf0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
8d00: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
8d10: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
8d20: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
8d30: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
8d40: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
8d50: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
8d60: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
8d70: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
8d80: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
8d90: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
8da0: 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74  ter an OOM fault
8db0: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
8dc0: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
8dd0: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
8de0: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
8df0: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
8e00: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
8e10: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
8e20: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
8e30: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
8e40: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
8e50: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
8e60: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
8e70: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
8e80: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
8e90: 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ind..*/.VdbeOp *
8ea0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
8eb0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
8ec0: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
8ed0: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
8ee0: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
8ef0: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
8f00: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
8f10: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
8f20: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
8f30: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
8f40: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
8f50: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
8f60: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
8f70: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
8f80: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
8f90: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
8fa0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
8fb0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
8fc0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
8fd0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
8fe0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
8ff0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
9000: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
9010: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
9020: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9030: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
9040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9050: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
9060: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
9070: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
9080: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
9090: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
90a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
90b0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a  PLAIN_COMMENTS).
90c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
90d0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
90e0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72  r one of the par
90f0: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ameters to the o
9100: 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74  pcode pOp.** det
9110: 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61  ermined by chara
9120: 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69  cter c..*/.stati
9130: 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50  c int translateP
9140: 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f  (char c, const O
9150: 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63  p *pOp){.  if( c
9160: 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70  =='1' ) return p
9170: 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d  Op->p1;.  if( c=
9180: 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='2' ) return pO
9190: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p2;.  if( c==
91a0: 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '3' ) return pOp
91b0: 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p3;.  if( c=='
91c0: 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  4' ) return pOp-
91d0: 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  >p4.i;.  return 
91e0: 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  pOp->p5;.}../*.*
91f0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
9200: 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d  ng for the "comm
9210: 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20  ent" field of a 
9220: 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74  VDBE opcode list
9230: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ing..**.** The S
9240: 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69  ynopsis: field i
9250: 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  n comments in th
9260: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
9270: 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72  file gets conver
9280: 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74  ted.** to an ext
9290: 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ra string that i
92a0: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
92b0: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
92c0: 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a  ame().  In the.*
92d0: 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68  * absence of oth
92e0: 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69  er comments, thi
92f0: 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d  s synopsis becom
9300: 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  es the comment o
9310: 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a  n the opcode..**
9320: 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f   Some translatio
9330: 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20  n occurs:.**.** 
9340: 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20        "PX"      
9350: 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20  ->  "r[X]".**   
9360: 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e      "PX@PY"   ->
9370: 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20    "r[X..X+Y-1]" 
9380: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
9390: 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20  is 0 or 1.**    
93a0: 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20     "PX@PY+1" -> 
93b0: 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20   "r[X..X+Y]"    
93c0: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
93d0: 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59  s 0.**       "PY
93e0: 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e  ..PY"  ->  "r[X.
93f0: 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b  .Y]"      or "r[
9400: 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73  x]" if y<=x.*/.s
9410: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
9420: 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73  yComment(.  cons
9430: 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f  t Op *pOp,     /
9440: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  * The opcode to 
9450: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a  be commented */.
9460: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9470: 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  4,   /* Previous
9480: 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75  ly obtained valu
9490: 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68  e for P4 */.  ch
94a0: 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20  ar *zTemp,      
94b0: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
94c0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
94d0: 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Temp          /*
94e0: 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
94f0: 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29   in zTemp[] */.)
9500: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
9510: 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  zOpName;.  const
9520: 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73   char *zSynopsis
9530: 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b  ;.  int nOpName;
9540: 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20  .  int ii, jj;. 
9550: 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a   char zAlt[50];.
9560: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
9570: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
9580: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
9590: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
95a0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
95b0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
95c0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
95d0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
95e0: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
95f0: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
9600: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
9610: 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73  e + 1;.    if( s
9620: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
9630: 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"IF ",3)==0 ){.
9640: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
9650: 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  5 & SQLITE_STORE
9660: 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  P2 ){.        sq
9670: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9680: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
9690: 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29  t, "r[P2] = (%s)
96a0: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
96b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
96c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
96d0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
96e0: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25  lt), zAlt, "if %
96f0: 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e  s goto P2", zSyn
9700: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9710: 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69  }.      zSynopsi
9720: 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a  s = zAlt;.    }.
9730: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
9740: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
9750: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
9760: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
9770: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
9780: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
9790: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
97a0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
97b0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
97c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
97d0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
97e0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
97f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9800: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
9810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9820: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
9830: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
9840: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
9850: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
9860: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
9870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9880: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
9890: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
98a0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
98b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
98c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
98d0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
98e0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
98f0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9900: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
9910: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
9920: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
9930: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
9940: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
9950: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
9960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
9970: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
9980: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
9990: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
99a0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
99b0: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
99c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
99d0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
99f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9a10: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
9a20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9a30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
9a40: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
9a50: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
9a60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9a70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
9a80: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
9a90: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
9aa0: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
9ab0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9ac0: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
9ad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9ae0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
9af0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9b00: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
9b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
9b20: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
9b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9b40: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
9b50: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
9b60: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
9b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9b80: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
9b90: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
9ba0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
9bb0: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
9bc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9bd0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
9be0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
9bf0: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
9c00: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
9c10: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
9c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9c30: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
9c40: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
9c50: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
9c60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9c70: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
9c80: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
9c90: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
9ca0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
9cb0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9cc0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23  LITE_DEBUG */..#
9cd0: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
9ce0: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
9cf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9d00: 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  OR_HINTS)./*.** 
9d10: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34  Translate the P4
9d20: 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72  .pExpr value for
9d30: 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e   an OP_CursorHin
9d40: 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65  t opcode into te
9d50: 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  xt.** that can b
9d60: 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74  e displayed in t
9d70: 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20  he P4 column of 
9d80: 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a  EXPLAIN output..
9d90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
9da0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74 72  isplayP4Expr(Str
9db0: 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a  Accum *p, Expr *
9dc0: 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20  pExpr){.  const 
9dd0: 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20  char *zOp = 0;. 
9de0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
9df0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9e00: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  K_STRING:.      
9e10: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9e20: 6e 64 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78  ndf(p, "%Q", pEx
9e30: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
9e40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9e50: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
9e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9e70: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
9e80: 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  d", pExpr->u.iVa
9e90: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
9ea0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
9eb0: 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL:.      sqlit
9ec0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
9ed0: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ef0: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
9f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
9f10: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 5b  r_appendf(p, "r[
9f20: 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d]", pExpr->iTa
9f30: 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
9f40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9f50: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
9f60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9f70: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
9f80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
9f90: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 6f 77  _appendf(p, "row
9fa0: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
9fb0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9fc0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
9fd0: 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45  , "c%d", (int)pE
9fe0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
9ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a000: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a010: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
a020: 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20  Op = "LT";      
a030: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a040: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LE:      zOp 
a050: 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65  = "LE";      bre
a060: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a070: 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GT:      zOp = "
a080: 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GT";      break;
a090: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a0a0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22        zOp = "GE"
a0b0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a0c0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
a0d0: 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20     zOp = "NE";  
a0e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a0f0: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
a100: 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  zOp = "EQ";     
a110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a120: 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70   TK_IS:      zOp
a130: 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72   = "IS";      br
a140: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a150: 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20  _ISNOT:   zOp = 
a160: 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b  "ISNOT";   break
a170: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
a180: 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e  D:     zOp = "AN
a190: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
a1a0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
a1b0: 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20      zOp = "OR"; 
a1c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a1d0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
a1e0: 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20   zOp = "ADD";   
a1f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a200: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f  e TK_STAR:    zO
a210: 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62  p = "MUL";     b
a220: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a230: 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d  K_MINUS:   zOp =
a240: 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61   "SUB";     brea
a250: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
a260: 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52  EM:     zOp = "R
a270: 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EM";     break;.
a280: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
a290: 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41  ND:  zOp = "BITA
a2a0: 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ND";  break;.   
a2b0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
a2c0: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b    zOp = "BITOR";
a2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a2e0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
a2f0: 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20  Op = "DIV";     
a300: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a310: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_LSHIFT:  zOp 
a320: 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65  = "LSHIFT";  bre
a330: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a340: 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  RSHIFT:  zOp = "
a350: 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  RSHIFT";  break;
a360: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
a370: 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e  CAT:  zOp = "CON
a380: 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  CAT";  break;.  
a390: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
a3a0: 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22  :  zOp = "MINUS"
a3b0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a3c0: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
a3d0: 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20  zOp = "PLUS";   
a3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a3f0: 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70   TK_BITNOT:  zOp
a400: 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72   = "BITNOT";  br
a410: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a420: 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _NOT:     zOp = 
a430: 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  "NOT";     break
a440: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
a450: 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53  NULL:  zOp = "IS
a460: 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NULL";  break;. 
a470: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
a480: 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55  LL: zOp = "NOTNU
a490: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
a4a0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
a4b0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a4c0: 6e 64 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78  ndf(p, "%s", "ex
a4d0: 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pr");.      brea
a4e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f  k;.  }..  if( zO
a4f0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
a500: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a510: 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20  "%s(", zOp);.   
a520: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
a530: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a540: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
a550: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
a560: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a570: 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20  nd(p, ",", 1);. 
a580: 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78       displayP4Ex
a590: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  pr(p, pExpr->pRi
a5a0: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
a5b0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a5c0: 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20  nd(p, ")", 1);. 
a5d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56   }.}.#endif /* V
a5e0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
a5f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
a600: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
a610: 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56  INTS) */...#if V
a620: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f  DBE_DISPLAY_P4./
a630: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
a640: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
a650: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
a660: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
a670: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
a680: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
a690: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
a6a0: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
a6b0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
a6c0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
a6d0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
a6e0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
a6f0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74  P4 = zTemp;.  St
a700: 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65  rAccum x;.  asse
a710: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
a720: 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
a730: 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54  umInit(&x, 0, zT
a740: 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a  emp, nTemp, 0);.
a750: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
a760: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
a770: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
a780: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
a790: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
a7a0: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
a7b0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  KeyInfo;.      a
a7c0: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
a7d0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
a7e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a7f0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
a800: 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  "k(%d", pKeyInfo
a810: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20 20  ->nKeyField);.  
a820: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a830: 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
a840: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
a850: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
a860: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
a870: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
a880: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
a890: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
a8a0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  ->zName : "";.  
a8b0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
a8c0: 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22  (zColl, "BINARY"
a8d0: 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  )==0 ) zColl = "
a8e0: 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  B";.        sqli
a8f0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a900: 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 0a 20 20  &x, ",%s%s", .  
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
a920: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
a930: 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c  r[j] ? "-" : "",
a940: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d   zColl);.      }
a950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a960: 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 29  tr_append(&x, ")
a970: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
a980: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
a990: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
a9a0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
a9b0: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
a9c0: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
a9d0: 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e  xpr(&x, pOp->p4.
a9e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  pExpr);.      br
a9f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
aa00: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  f.    case P4_CO
aa10: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
aa20: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
aa30: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
aa40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
aa50: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 28 25  _appendf(&x, "(%
aa60: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
aa70: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
aa80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
aa90: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
aaa0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
aab0: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
aac0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
aad0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
aae0: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
aaf0: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
ab00: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
ab10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  eak;.    }.#if d
ab20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
ab30: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
ab40: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
ab50: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
ab60: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
ab70: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
ab80: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
ab90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
aba0: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
abb0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
abc0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
abd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
abe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
abf0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
ac00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
ac10: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
ac20: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
ac30: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
ac40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ac50: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
ac60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
ac70: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 64  _appendf(&x, "%d
ac80: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
ac90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aca0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
acb0: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
acc0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
acd0: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  &x, "%.16g", *pO
ace0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
acf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ad00: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
ad10: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
ad20: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
ad30: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
ad40: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
ad50: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
ad60: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
ad70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
ad80: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
ad90: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
ada0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
adb0: 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70  df(&x, "%lld", p
adc0: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
add0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
ade0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
adf0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
ae00: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
ae10: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  (&x, "%.16g", pM
ae20: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
ae30: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
ae40: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
ae50: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
ae60: 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20  = "NULL";.      
ae70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
ae80: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
ae90: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
aea0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
aeb0: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
aec0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
aed0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
aee0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
aef0: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
af00: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
af10: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
af20: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
af30: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
af40: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
af50: 65 6e 64 66 28 26 78 2c 20 22 76 74 61 62 3a 25  endf(&x, "vtab:%
af60: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
af70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
af80: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
af90: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
afa0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
afb0: 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e   int *ai = pOp->
afc0: 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74  p4.ai;.      int
afd0: 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a   n = ai[0];   /*
afe0: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
aff0: 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41  nt of an INTARRA
b000: 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a  Y is always the.
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20         ** count 
b030: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b040: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c   elements to fol
b050: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  low */.      for
b060: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
b070: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b080: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b090: 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b  , ",%d", ai[i]);
b0a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
b0b0: 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20  Temp[0] = '[';. 
b0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b0d0: 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c  _append(&x, "]",
b0e0: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
b0f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b100: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
b110: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b120: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b130: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
b140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b150: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42 4c     case P4_DYNBL
b160: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  OB:.    case P4_
b170: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
b180: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
b190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1a0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54 41  }.    case P4_TA
b1b0: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
b1c0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b1d0: 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  (&x, "%s", pOp->
b1e0: 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  p4.pTab->zName);
b1f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b200: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
b210: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
b220: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
b230: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
b240: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
b250: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
b260: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
b270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
b280: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
b290: 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74  sh(&x);.  assert
b2a0: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
b2b0: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
b2c0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
b2d0: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
b2e0: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
b2f0: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
b300: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
b310: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
b320: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
b330: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
b340: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
b350: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
b360: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
b370: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b380: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
b390: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
b3a0: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
b3b0: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
b3c0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
b3d0: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
b3e0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
b3f0: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
b400: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
b410: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
b420: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
b430: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b440: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
b450: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
b460: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
b470: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
b480: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
b490: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
b4a0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
b4b0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
b4c0: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
b4d0: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
b4e0: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
b4f0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
b500: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
b510: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
b520: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
b530: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
b540: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
b550: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b560: 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20  ED_CACHE)./*.** 
b570: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
b580: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
b590: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
b5a0: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
b5b0: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
b5c0: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
b5d0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
b5e0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
b5f0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
b600: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
b610: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
b620: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
b630: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
b640: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
b650: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
b660: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
b670: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
b680: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
b690: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
b6a0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
b6b0: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
b6c0: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
b6d0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
b6e0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
b6f0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
b700: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
b710: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
b720: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
b730: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
b740: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
b750: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
b760: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
b770: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
b780: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
b790: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
b7a0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
b7b0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
b7c0: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
b7d0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
b7e0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
b7f0: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
b800: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
b810: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
b820: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
b830: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
b840: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
b850: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
b860: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
b870: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
b880: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
b890: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
b8a0: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
b8b0: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
b8c0: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
b8d0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
b8e0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
b8f0: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
b900: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
b910: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
b920: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
b930: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
b940: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
b950: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
b960: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
b970: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
b980: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
b990: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
b9a0: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
b9b0: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
b9c0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
b9d0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
b9e0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
b9f0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
ba00: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
ba10: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
ba20: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
ba30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
ba40: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
ba50: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
ba60: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
ba70: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
ba80: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
ba90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
baa0: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
bab0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
bac0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
bad0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
bae0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
baf0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
bb00: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
bb10: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
bb20: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
bb30: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
bb40: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
bb50: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ()..*/.static SQ
bb60: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
bb70: 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62  id vdbeLeave(Vdb
bb80: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
bb90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
bba0: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
bbb0: 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  nDb;.  db = p->d
bbc0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
bbd0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
bbe0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
bbf0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
bc00: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
bc10: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
bc20: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
bc30: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
bc40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bc50: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
bc60: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
bc70: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
bc80: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
bc90: 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  p){.  if( DbMask
bca0: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
bcb0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
bcc0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
bcd0: 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76  se */.  vdbeLeav
bce0: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e(p);.}.#endif..
bcf0: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
bd00: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
bd10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
bd20: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
bd30: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
bd40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bd50: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
bd60: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
bd70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
bd80: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
bd90: 20 69 6e 74 20 70 63 2c 20 56 64 62 65 4f 70 20   int pc, VdbeOp 
bda0: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
bdb0: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
bdc0: 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d  50];.  char zCom
bdd0: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
bde0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
bdf0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
be00: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
be10: 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  13s %.2X %s\n";.
be20: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
be30: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
be40: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
be50: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
be60: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
be70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
be80: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
be90: 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  .  displayCommen
bea0: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d  t(pOp, zP4, zCom
beb0: 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b  , sizeof(zCom));
bec0: 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d  .#else.  zCom[0]
bed0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f   = 0;.#endif.  /
bee0: 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74  * NB:  The sqlit
bef0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66  e3OpcodeName() f
bf00: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
bf10: 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63  mented by code c
bf20: 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74  reated.  ** by t
bf30: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
bf40: 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61   and mkopcodec.a
bf50: 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68  wk scripts which
bf60: 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a   extract the.  *
bf70: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
bf80: 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  om the vdbe.c so
bf90: 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66  urce text */.  f
bfa0: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
bfb0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
bfc0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
bfd0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
bfe0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
bff0: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
c000: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
c010: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
c020: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
c030: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
c040: 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f  alize an array o
c050: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e  f N Mem element.
c060: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c070: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d  initMemArray(Mem
c080: 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69   *p, int N, sqli
c090: 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61  te3 *db, u16 fla
c0a0: 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e  gs){.  while( (N
c0b0: 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  --)>0 ){.    p->
c0c0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e  db = db;.    p->
c0d0: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
c0e0: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
c0f0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
c100: 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70  E_DEBUG.    p->p
c110: 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23  ScopyFrom = 0;.#
c120: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
c130: 49 54 45 5f 44 45 42 55 47 5f 43 4f 4c 55 4d 4e  ITE_DEBUG_COLUMN
c140: 43 41 43 48 45 0a 20 20 20 20 70 2d 3e 69 54 61  CACHE.    p->iTa
c150: 62 43 6f 6c 48 61 73 68 20 3d 20 30 3b 0a 23 65  bColHash = 0;.#e
c160: 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20  ndif.    p++;.  
c170: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  }.}../*.** Relea
c180: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
c190: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
c1a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
c1b0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
c1c0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
c1d0: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
c1e0: 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b   Mem *pEnd = &p[
c1f0: 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  N];.    sqlite3 
c200: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
c210: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
c220: 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64  Freed ){.      d
c230: 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
c240: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
c250: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c260: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
c270: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
c280: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65  pEnd );.      re
c290: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
c2a0: 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  do{.      assert
c2b0: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
c2c0: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
c2d0: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .db );.      ass
c2e0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
c2f0: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
c300: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20  ts(p) );..      
c310: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
c320: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
c330: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
c340: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
c350: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
c360: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
c370: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
c380: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
c390: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
c3a0: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
c3b0: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
c3c0: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
c3d0: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
c3e0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c3f0: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
c400: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
c410: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
c420: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
c430: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
c440: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
c450: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
c460: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
c470: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
c480: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
c490: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
c4a0: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
c4b0: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
c4c0: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
c4d0: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
c4e0: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
c4f0: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
c500: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
c510: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
c520: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
c530: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
c540: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
c550: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
c560: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
c570: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
c580: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
c590: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
c5a0: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
c5b0: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
c5c0: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
c5d0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
c5e0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
c5f0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
c600: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65  _Agg );.      te
c610: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
c620: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
c630: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
c640: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61  >flags & MEM_Fra
c650: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  me );.      test
c660: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
c670: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20   MEM_RowSet );. 
c680: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
c690: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
c6a0: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
c6b0: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
c6c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c6d0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
c6e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
c6f0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >szMalloc ){.   
c700: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
c710: 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  eeNN(db, p->zMal
c720: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
c730: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
c740: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
c750: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
c760: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
c770: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
c780: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
c790: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
c7a0: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
c7b0: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
c7c0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
c7d0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
c7e0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
c7f0: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
c800: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
c810: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
c820: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
c830: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
c840: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
c850: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
c860: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
c870: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
c880: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
c890: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
c8a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
c8b0: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
c8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
c8d0: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
c8e0: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
c8f0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c900: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
c910: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  em);.  sqlite3Vd
c920: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
c930: 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41  p->v->db, &p->pA
c940: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
c950: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c960: 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a  p->v->db, p);.}.
c970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c980: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
c990: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
c9a0: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
c9b0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
c9c0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
c9d0: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
c9e0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
c9f0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
ca00: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
ca10: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
ca20: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
ca30: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
ca40: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
ca50: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
ca60: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
ca70: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
ca80: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
ca90: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
caa0: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
cab0: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
cac0: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
cad0: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
cae0: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
caf0: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
cb00: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
cb10: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
cb20: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
cb30: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
cb40: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
cb50: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
cb60: 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30 34  PLAN..** 2018-04
cb70: 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70 6c  -24:  In p->expl
cb80: 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68 65  ain==2 mode, the
cb90: 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 73   OP_Init opcodes
cba0: 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a 20   of triggers.** 
cbb0: 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c 20  are also shown, 
cbc0: 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75 6e  so that the boun
cbd0: 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20 74  daries between t
cbe0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
cbf0: 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69 67  and.** each trig
cc00: 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a 2a  ger are clear..*
cc10: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
cc20: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
cc30: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
cc40: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
cc50: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
cc60: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
cc70: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
cc80: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
cc90: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
cca0: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ccc0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
ccd0: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
cd00: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
cd10: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
cd20: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cd50: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
cd60: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
cd70: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
cd80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
cd90: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
cda0: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
cdb0: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
cde0: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
cdf0: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
ce00: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
ce10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ce20: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
ce30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
ce40: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ce70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
ce80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
ceb0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
cec0: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
ced0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
cee0: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
cef0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4c   set */.  int bL
cf00: 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28 70  istSubprogs = (p
cf10: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20  ->explain==1 || 
cf20: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
cf30: 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29 21  ITE_TriggerEQP)!
cf40: 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20 3d  =0);.  Op *pOp =
cf50: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
cf60: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
cf70: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
cf80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
cf90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
cfa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
cfb0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
cfc0: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
cfd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
cfe0: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
cff0: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
d000: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
d010: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
d020: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
d030: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
d040: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
d050: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
d060: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
d070: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
d080: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
d090: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
d0a0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
d0b0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d0c0: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
d0d0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
d0e0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d0f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
d100: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
d110: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
d120: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
d130: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d140: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
d150: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d160: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
d170: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d180: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
d190: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d1a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
d1b0: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
d1c0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
d1d0: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
d1e0: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
d1f0: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
d200: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
d210: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
d220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
d230: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
d240: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
d250: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
d260: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
d270: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
d280: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
d290: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
d2a0: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
d2b0: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
d2c0: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
d2d0: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
d2e0: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
d2f0: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
d300: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
d310: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
d320: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
d330: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
d340: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
d350: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
d360: 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75 62  ;.  if( bListSub
d370: 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a 20  progs ){.    /* 
d380: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
d390: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
d3a0: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
d3b0: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
d3c0: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
d3d0: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
d3e0: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
d3f0: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
d400: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
d410: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
d420: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
d430: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
d440: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
d450: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
d460: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
d470: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
d480: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
d490: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
d4a0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
d4b0: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
d4c0: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
d4d0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
d4e0: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
d4f0: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
d500: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
d510: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
d520: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
d530: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
d540: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
d550: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
d560: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
d570: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
d580: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
d590: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
d5a0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
d5b0: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
d5c0: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
d5d0: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
d5e0: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31 29  .  }..  while(1)
d5f0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74 73  {  /* Loop exits
d600: 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20   via break */.  
d610: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
d620: 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29     if( i>=nRow )
d630: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
d640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
d650: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
d660: 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E;.      break;.
d670: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
d680: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
d690: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
d6a0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
d6b0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
d6c0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
d6d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
d6e0: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
d6f0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
d700: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
d710: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
d720: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
d730: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
d740: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
d750: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
d760: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
d770: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
d780: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
d790: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
d7a0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
d7b0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
d7c0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
d7d0: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
d7e0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
d7f0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
d800: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
d810: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68 65     }..    /* Whe
d820: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
d830: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
d840: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
d850: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
d860: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f    ** a P4_SUBPRO
d870: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20  GRAM argument), 
d880: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20  expand the size 
d890: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  of the array of 
d8a0: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20  subprograms.    
d8b0: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
d8c0: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
d8d0: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
d8e0: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
d8f0: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 2a  subprogram.    *
d900: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
d910: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
d920: 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69 73   */.    if( bLis
d930: 74 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f 70  tSubprogs && pOp
d940: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
d950: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
d960: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
d970: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
d980: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
d990: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
d9a0: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a  r(j=0; j<nSub; j
d9b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d9c0: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
d9d0: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
d9e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d9f0: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 29     if( j==nSub )
da00: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
da10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
da20: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
da30: 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20 20  , nSub!=0);.    
da40: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
da50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
da60: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
da70: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
da80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da90: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53 75    }.        apSu
daa0: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
dab0: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
dac0: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
dad0: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
dae0: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70 53  gram;.        pS
daf0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
db00: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 70  _Blob;.        p
db10: 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69  Sub->n = nSub*si
db20: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
db30: 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20  );.        nRow 
db40: 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  += pOp->p4.pProg
db50: 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  ram->nOp;.      
db60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
db70: 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20 62  p->explain<2 ) b
db80: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f  reak;.    if( pO
db90: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78  p->opcode==OP_Ex
dba0: 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a 20  plain ) break;. 
dbb0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
dbc0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
dbd0: 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b 0a  ->pc>1 ) break;.
dbe0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
dbf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dc00: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
dc10: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
dc20: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
dc30: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
dc40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
dc50: 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
dc60: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73  e3VdbeError(p, s
dc70: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
dc80: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
dc90: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 34  .      char *zP4
dca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  ;.      if( p->e
dcb0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
dcc0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
dcd0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
dce0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
dcf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
dd20: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  nter */.        
dd30: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20 20  pMem++;.    .   
dd40: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
dd50: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
dd60: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
dd70: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
dd80: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
dd90: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
dda0: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
ddb0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  de */.        as
ddc0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
ddd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
dde0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
ddf0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
de00: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
de10: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
de20: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
de30: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
de40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
de50: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
de60: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
de70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
de90: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
dea0: 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ;..      pMem->f
deb0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
dec0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
ded0: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
df00: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
df10: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
df20: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
df30: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
df40: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df60: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
df70: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73  ++;..      if( s
df80: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
df90: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
dfa0: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20  , 100) ){ /* P4 
dfb0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
dfc0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
dfd0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
dfe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dff0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
e000: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e010: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
e020: 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20 3d  erm;.      zP4 =
e030: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
e040: 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73  pMem->z, pMem->s
e050: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
e060: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
e070: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
e080: 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ->n = 0;.       
e090: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
e0a0: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
e0b0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
e0c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
e0d0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
e0e0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
e0f0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
e100: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e110: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
e120: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
e130: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
e140: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
e150: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ++;..      if( p
e160: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
e170: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
e180: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
e190: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
e1a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
e1b0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
e1c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
e1d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e1e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
e200: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e210: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
e220: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
e230: 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   2;.        sqli
e240: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
e250: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
e260: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
e270: 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  P5 */.        pM
e280: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
e290: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
e2a0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66 64  Mem++;.    .#ifd
e2b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e2c0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
e2d0: 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  S.        if( sq
e2e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
e2f0: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
e300: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
e310: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
e320: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e330: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e340: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
e350: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e360: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e370: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
e380: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
e390: 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d  >n = displayComm
e3a0: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d  ent(pOp, zP4, pM
e3b0: 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20  em->z, 500);.   
e3c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
e3d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
e3e0: 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  lse.        pMem
e3f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
e400: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
e410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
e420: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ment */.#endif. 
e430: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
e440: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
e450: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
e460: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65  1);.      p->pRe
e470: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
e480: 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em[1];.      p->
e490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e4a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e4b0: 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 7d  E_ROW;.    }.  }
e4c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e4d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e4e0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
e4f0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e500: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
e510: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
e520: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
e530: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
e540: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
e550: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
e560: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  Vdbe *p){.  cons
e570: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20  t char *z = 0;. 
e580: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
e590: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b      z = p->zSql;
e5a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
e5b0: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f  nOp>=1 ){.    co
e5c0: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  nst VdbeOp *pOp 
e5d0: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
e5e0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e5f0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
e600: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
e610: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e      z = pOp->p4.
e620: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  z;.      while( 
e630: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
e640: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a  z) ) z++;.    }.
e650: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72    }.  if( z ) pr
e660: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
e670: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  n", z);.}.#endif
e680: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
e690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
e6a0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
e6b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
e6c0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
e6d0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
e6e0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
e6f0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
e700: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
e710: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
e720: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
e730: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
e740: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
e750: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
e760: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
e770: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
e780: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
e790: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
e7a0: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
e7b0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
e7c0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
e7d0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
e7e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e7f0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
e800: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
e810: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
e820: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
e830: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
e840: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
e850: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
e860: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
e870: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
e880: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
e890: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
e8a0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
e8b0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
e8c0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
e8d0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
e8e0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
e8f0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
e900: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
e910: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
e920: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
e930: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
e940: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
e950: 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73  CE */../* An ins
e960: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
e970: 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62  ject describes b
e980: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
e990: 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20  able for use.** 
e9a0: 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73  by subcomponents
e9b0: 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73   of a prepared s
e9c0: 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65  tatement.  Space
e9d0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75   is allocated ou
e9e0: 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62  t.** of a Reusab
e9f0: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62  leSpace object b
ea00: 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65  y the allocSpace
ea10: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77  () routine below
ea20: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73  ..*/.struct Reus
ea30: 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38  ableSpace {.  u8
ea40: 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
ea50: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
ea60: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
ea70: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
ea80: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61   /* Bytes of ava
ea90: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f  ilable memory */
eaa0: 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20  .  int nNeeded; 
eab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
eac0: 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c   bytes that coul
ead0: 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  d not be allocat
eae0: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79  ed */.};../* Try
eaf0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79   to allocate nBy
eb00: 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79  te bytes of 8-by
eb10: 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20  te aligned bulk 
eb20: 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a  memory for pBuf.
eb30: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73  ** from the Reus
eb40: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
eb50: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
eb60: 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
eb70: 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f  ated.** memory o
eb80: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69  n success.  If i
eb90: 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f  nsufficient memo
eba0: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
ebb0: 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62  in the.** Reusab
ebc0: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20  leSpace object, 
ebd0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75  increase the Reu
ebe0: 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64  sableSpace.nNeed
ebf0: 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74  ed.** value by t
ec00: 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64  he amount needed
ec10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
ec20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20  ..**.** If pBuf 
ec30: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79  is not initially
ec40: 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e   NULL, that mean
ec50: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  s that the memor
ec60: 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  y has already.**
ec70: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
ec80: 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  by a prior call 
ec90: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  to this routine,
eca0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
ecb0: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75  a copy.** of pBu
ecc0: 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73  f and leave Reus
ecd0: 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e  ableSpace unchan
ece0: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ged..**.** This 
ecf0: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70  allocator is emp
ed00: 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f  loyed to repurpo
ed10: 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20  se unused slots 
ed20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ed30: 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61  e.** opcode arra
ed40: 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  y of prepared st
ed50: 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65  ate for other me
ed60: 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68  mory needs of th
ed70: 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  e prepared.** st
ed80: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
ed90: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
eda0: 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65  ace(.  struct Re
edb0: 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20  usableSpace *p, 
edc0: 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20   /* Bulk memory 
edd0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
ede0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  location */.  vo
edf0: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
ee00: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
ee10: 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c  er to a prior al
ee20: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  location */.  in
ee30: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
ee40: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
ee50: 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
ee60: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
ee70: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
ee80: 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65  GNMENT(p->pSpace
ee90: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  ) );.  if( pBuf=
eea0: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
eeb0: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
eec0: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c  .    if( nByte <
eed0: 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  = p->nFree ){.  
eee0: 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20      p->nFree -= 
eef0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75  nByte;.      pBu
ef00: 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70  f = &p->pSpace[p
ef10: 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65  ->nFree];.    }e
ef20: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e  lse{.      p->nN
ef30: 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a  eeded += nByte;.
ef40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
ef50: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
ef60: 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29  LIGNMENT(pBuf) )
ef70: 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
ef80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
ef90: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
efa0: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
efb0: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
efc0: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
efd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
efe0: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
eff0: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
f000: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
f010: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
f020: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
f030: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
f040: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
f050: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
f060: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c  DBE_MAGIC_INIT |
f070: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
f080: 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a  _MAGIC_RESET );.
f090: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
f0a0: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
f0b0: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
f0c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
f0d0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
f0e0: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
f0f0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
f100: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
f110: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
f120: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
f130: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
f140: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
f150: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
f160: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
f170: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
f180: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
f190: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
f1a0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
f1b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
f1c0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
f1d0: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  bort;.  p->nChan
f1e0: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
f1f0: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
f200: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
f210: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
f220: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
f230: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
f240: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
f250: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
f260: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
f270: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
f280: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
f290: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
f2a0: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
f2b0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
f2c0: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
f2d0: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
f2e0: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
f2f0: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
f300: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
f310: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
f320: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
f330: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
f340: 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65  locating registe
f350: 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  rs and initializ
f360: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
f370: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
f380: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
f390: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
f3a0: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
f3b0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
f3c0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
f3d0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
f3e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f3f0: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
f400: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20  exactly once on 
f410: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
f420: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
f430: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f440: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
f450: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
f460: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
f470: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
f480: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f490: 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20  called, further 
f4a0: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
f4b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
f4c0: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
f4d0: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
f4e0: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
f4f0: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
f500: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
f510: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
f520: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
f530: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
f540: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
f550: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
f560: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
f570: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
f580: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
f590: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
f5a0: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
f5b0: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
f5c0: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
f5d0: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
f5e0: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
f5f0: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
f600: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
f610: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
f620: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
f630: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f650: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
f660: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
f670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
f680: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f690: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f6a0: 3b 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 64 61 74 61 62      /* The datab
f6c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
f6d0: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f700: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
f710: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f730: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
f740: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
f750: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
f760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f770: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f780: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
f790: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f7c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
f7d0: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
f7e0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f810: 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  */.  struct Reus
f820: 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20  ableSpace x;    
f830: 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20      /* Reusable 
f840: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a  bulk memory */..
f850: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
f860: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
f870: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
f880: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
f890: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
f8a0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
f8b0: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
f8c0: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
f8d0: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
f8e0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
f8f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
f900: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
f910: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
f920: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
f930: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
f940: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
f950: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
f960: 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61  xArg;.  .  /* Ea
f970: 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61  ch cursor uses a
f980: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54   memory cell.  T
f990: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
f9a0: 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20  (cursor 0) can. 
f9b0: 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20   ** use aMem[0] 
f9c0: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68  which is not oth
f9d0: 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74  erwise used by t
f9e0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
f9f0: 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20    Allocate.  ** 
fa00: 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
fa10: 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63   of aMem[] for c
fa20: 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65  ursors 1 and gre
fa30: 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61  ater..  ** See a
fa40: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
fa50: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
fa60: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  em += nCursor;. 
fa70: 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20   if( nCursor==0 
fa80: 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d  && nMem>0 ) nMem
fa90: 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f  ++;  /* Space fo
faa0: 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69  r aMem[0] even i
fab0: 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20  f not used */.. 
fac0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
fad0: 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65  ow much reusable
fae0: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
faf0: 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20  able at the end 
fb00: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f  of the.  ** opco
fb10: 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20  de array.  This 
fb20: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c  extra memory wil
fb30: 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  l be reallocated
fb40: 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65   for other eleme
fb50: 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  nts.  ** of the 
fb60: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
fb70: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52  nt..  */.  n = R
fb80: 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29  OUND8(sizeof(Op)
fb90: 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20  *p->nOp);       
fba0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
fbb0: 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  of opcode memory
fbc0: 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70   used */.  x.pSp
fbd0: 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e  ace = &((u8*)p->
fbe0: 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20  aOp)[n];        
fbf0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
fc00: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a   opcode memory *
fc10: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  /.  assert( EIGH
fc20: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
fc30: 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20  (x.pSpace) );.  
fc40: 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44  x.nFree = ROUNDD
fc50: 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f  OWN8(pParse->szO
fc60: 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a  pAlloc - n);  /*
fc70: 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   Bytes of unused
fc80: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73   memory */.  ass
fc90: 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20  ert( x.nFree>=0 
fca0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
fcb0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
fcc0: 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46  T(&x.pSpace[x.nF
fcd0: 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f  ree]) );..  reso
fce0: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
fcf0: 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73  nArg);.  p->uses
fd00: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
fd10: 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  8)(pParse->isMul
fd20: 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73  tiWrite && pPars
fd30: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20  e->mayAbort);.  
fd40: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
fd50: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29  ain && nMem<10 )
fd60: 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b  {.    nMem = 10;
fd70: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65  .  }.  p->expire
fd80: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
fd90: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
fda0: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
fdb0: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
fdc0: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20  llocated in one 
fdd0: 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  or two.  ** pass
fde0: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
fdf0: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
fe00: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d  o reuse unused m
fe10: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20  emory at the .  
fe20: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
fe30: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
fe40: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
fe50: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
fe60: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
fe70: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
fe80: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
fe90: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
fea0: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
feb0: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
fec0: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69  he remainder usi
fed0: 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72  ng a fresh memor
fee0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  y allocation.  .
fef0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
ff00: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
ff10: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
ff20: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
ff30: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
ff40: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d  * the leftover m
ff50: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64  emory at the end
ff60: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
ff70: 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20  rray.  This can 
ff80: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
ff90: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
ffa0: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
ffb0: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
ffc0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
ffd0: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e  /.  do {.    x.n
ffe0: 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20  Needed = 0;.    
fff0: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
10000 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d  pace(&x, p->aMem
10010 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
10020 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  m));.    p->aVar
10030 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10040 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  , p->aVar, nVar*
10050 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
10060 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
10070 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10080 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
10090 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d  f(Mem*));.    p-
100a0 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
100b0 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72  ace(&x, p->apCsr
100c0 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
100d0 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a  (VdbeCursor*));.
100e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
100f0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
10100 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78  ATUS.    p->anEx
10110 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ec = allocSpace(
10120 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70  &x, p->anExec, p
10130 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
10140 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  ));.#endif.    i
10150 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20  f( x.nNeeded==0 
10160 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70  ) break;.    x.p
10170 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65  Space = p->pFree
10180 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
10190 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e  ocRawNN(db, x.nN
101a0 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46  eeded);.    x.nF
101b0 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b  ree = x.nNeeded;
101c0 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e  .  }while( !db->
101d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
101e0 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70  .  p->pVList = p
101f0 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20  Parse->pVList;. 
10200 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
10210 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
10220 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
10230 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  lain;.  if( db->
10240 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
10250 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b      p->nVar = 0;
10260 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
10270 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  = 0;.    p->nMem
10280 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
10290 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
102a0 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e  nCursor;.    p->
102b0 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
102c0 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  ar;.    initMemA
102d0 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56  rray(p->aVar, nV
102e0 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  ar, db, MEM_Null
102f0 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  );.    p->nMem =
10300 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d   nMem;.    initM
10310 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
10320 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55   nMem, db, MEM_U
10330 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d  ndefined);.    m
10340 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20  emset(p->apCsr, 
10350 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
10360 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10380 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10390 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74  TATUS.    memset
103a0 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70  (p->anExec, 0, p
103b0 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
103c0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ));.#endif.  }. 
103d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
103e0 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
103f0 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
10400 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
10410 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
10420 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
10430 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
10440 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
10450 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
10460 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
10470 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
10480 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
10490 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
104a0 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d  sert( pCx->pBtx=
104b0 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54  =0 || pCx->eCurT
104c0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
104d0 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  EE );.  switch( 
104e0 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b  pCx->eCurType ){
104f0 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
10500 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20  E_SORTER: {.    
10510 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
10520 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
10530 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pCx);.      brea
10540 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10550 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a  e CURTYPE_BTREE:
10560 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78   {.      if( pCx
10570 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  ->isEphemeral ){
10580 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78  .        if( pCx
10590 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33  ->pBtx ) sqlite3
105a0 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
105b0 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  pBtx);.        /
105c0 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
105d0 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
105e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
105f0 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
10600 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
10610 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
10620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10630 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
10640 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
10650 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10660 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
10670 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  r(pCx->uc.pCurso
10680 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
10690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
106a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
106b0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
106c0 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
106d0 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
106e0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
106f0 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d  or *pVCur = pCx-
10700 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20  >uc.pVCur;.     
10710 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
10720 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
10730 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70   pVCur->pVtab->p
10740 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73  Module;.      as
10750 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74  sert( pVCur->pVt
10760 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ab->nRef>0 );.  
10770 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62      pVCur->pVtab
10780 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
10790 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
107a0 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72  pVCur);.      br
107b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
107c0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  f.  }.}../*.** C
107d0 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
107e0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
107f0 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
10800 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
10810 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
10820 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
10830 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
10840 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10850 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
10860 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
10870 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
10880 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
10890 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
108a0 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
108b0 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
108c0 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
108d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
108e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
108f0 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
10900 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
10910 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
10920 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
10930 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
10940 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
10950 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
10960 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
10970 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
10980 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
10990 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
109a0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
109b0 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
109c0 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
109d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
109e0 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
109f0 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
10a00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10a10 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10a20 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
10a30 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
10a40 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
10a50 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
10a60 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
10a70 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
10a80 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
10a90 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
10aa0 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
10ab0 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
10ac0 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
10ad0 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
10ae0 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
10af0 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
10b00 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
10b10 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
10b20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
10b30 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
10b40 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
10b50 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74  bChange;.  sqlit
10b60 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
10b70 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70  ata(v->db, &v->p
10b80 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
10b90 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
10ba0 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
10bb0 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
10bc0 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
10bd0 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
10be0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10bf0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
10c00 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
10c10 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
10c20 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
10c30 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
10c40 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
10c50 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
10c60 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
10c70 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
10c80 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
10c90 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
10ca0 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
10cb0 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
10cc0 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
10cd0 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
10ce0 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
10cf0 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
10d00 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
10d10 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
10d20 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
10d30 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
10d40 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
10d50 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
10d60 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
10d70 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
10d80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
10d90 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
10da0 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
10db0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
10dc0 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
10dd0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
10de0 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
10df0 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
10e00 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
10e10 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
10e20 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
10e30 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
10e40 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
10e50 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
10e60 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
10e70 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
10e80 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
10e90 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
10ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
10eb0 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
10ec0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
10ed0 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
10ee0 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
10ef0 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
10f00 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
10f10 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
10f20 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26  AuxData(p->db, &
10f30 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
10f40 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
10f50 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
10f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10f70 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
10f80 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
10f90 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
10fa0 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
10fb0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
10fc0 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
10fd0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
10fe0 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
10ff0 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
11000 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
11010 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
11020 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
11030 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
11040 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
11050 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
11060 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
11070 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
11080 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
11090 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
110a0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
110b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
110c0 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65  b;..  if( p->nRe
110d0 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72  sColumn ){.    r
110e0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
110f0 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
11100 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
11110 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E_N);.    sqlite
11120 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
11130 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ColName);.  }.  
11140 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
11150 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
11160 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
11170 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
11180 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  ->aColName = (Me
11190 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
111a0 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
111b0 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
111c0 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
111d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e  0 ) return;.  in
111e0 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  itMemArray(p->aC
111f0 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d  olName, n, db, M
11200 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  EM_Null);.}../*.
11210 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
11220 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
11230 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
11240 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
11250 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
11260 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
11270 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
11280 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
11290 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
112a0 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
112b0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
112c0 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
112d0 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
112e0 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
112f0 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
11300 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
11310 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
11320 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
11330 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
11340 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
11350 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
11360 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
11370 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
11380 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
11390 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
113a0 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
113b0 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
113c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
113d0 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
113e0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
113f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
11400 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
11410 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
11420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11440 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
11450 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
11460 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
11490 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
114a0 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
114b0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
114c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
114d0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
114e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
114f0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
11500 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
11510 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
11520 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
11530 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
11540 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
11550 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
11560 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
11570 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
11580 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
11590 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
115a0 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
115b0 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
115c0 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
115d0 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
115e0 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
115f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
11600 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
11610 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
11620 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
11630 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
11640 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
11650 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
11660 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
11670 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
11680 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
11690 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
116a0 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
116b0 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
116c0 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
116d0 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
116e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
116f0 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
11700 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
11710 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
11720 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
11730 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
11740 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11750 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
11760 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
11770 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
11780 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
11790 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
117a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
117b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
117c0 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
117d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
117e0 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
117f0 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
11800 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
11810 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
11820 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
11830 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
11840 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
11850 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
11860 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e-transaction.  
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e   ** that are can
11890 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77  didates for a tw
118a0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75  o-phase commit u
118b0 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20  sing a.         
118c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73            ** mas
118d0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter-journal */. 
118e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
118f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
11900 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
11910 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11920 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
11930 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
11940 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
11950 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
11960 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
11970 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
11980 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
11990 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
119a0 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
119b0 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
119c0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
119d0 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
119e0 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
119f0 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
11a00 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
11a10 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
11a20 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
11a30 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
11a40 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
11a50 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
11a60 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
11a70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
11a80 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
11a90 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
11aa0 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
11ab0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
11ac0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
11ad0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
11ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
11af0 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
11b00 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
11b10 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
11b20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
11b30 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
11b40 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
11b50 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
11b60 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
11b70 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
11b80 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
11b90 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
11ba0 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
11bb0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
11bc0 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
11bd0 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
11be0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
11bf0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
11c00 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
11c10 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
11c20 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
11c30 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
11c40 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
11c50 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
11c60 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
11c70 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
11c80 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11c90 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
11ca0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
11cb0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
11cc0 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
11cd0 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
11ce0 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61  ase might need a
11cf0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11d00 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20  depends upon.   
11d10 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61     ** its journa
11d20 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74  l mode (among ot
11d30 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68  her things).  Th
11d40 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d  is matrix determ
11d50 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ines which.     
11d60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65   ** journal mode
11d70 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a  s use a master j
11d80 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68  ournal and which
11d90 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20   do not */.     
11da0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
11db0 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b   aMJNeeded[] = {
11dc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45  .        /* DELE
11dd0 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20  TE   */  1,.    
11de0 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20      /* PERSIST  
11df0 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
11e00 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30  * OFF       */ 0
11e10 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ,.        /* TRU
11e20 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20  NCATE  */ 1,.   
11e30 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20       /* MEMORY  
11e40 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
11e50 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20  /* WAL       */ 
11e60 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
11e70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
11e80 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
11e90 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
11ea0 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  /.      needXcom
11eb0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  mit = 1;.      s
11ec0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11ed0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61  (pBt);.      pPa
11ee0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
11ef0 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
11f00 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
11f10 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  i].safety_level!
11f20 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
11f30 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26  US_OFF.       &&
11f40 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74   aMJNeeded[sqlit
11f50 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
11f60 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20  lMode(pPager)]. 
11f70 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
11f80 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61  PagerIsMemdb(pPa
11f90 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ger)==0.      ){
11fa0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
11fb0 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
11fc0 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
11fd0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
11fe0 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
11ff0 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
12000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
12010 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
12020 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12030 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12040 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
12050 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12060 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
12070 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
12080 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
12090 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
120a0 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
120b0 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
120c0 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
120d0 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
120e0 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
120f0 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
12100 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
12110 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
12120 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
12130 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
12140 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
12150 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
12160 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
12170 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
12180 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
12190 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
121a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
121b0 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
121c0 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
121d0 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
121e0 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
121f0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
12200 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
12210 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
12220 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
12230 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
12240 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
12250 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
12260 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
12270 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
12280 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
12290 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
122a0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
122b0 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
122c0 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
122d0 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
122e0 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
122f0 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
12300 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
12310 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
12320 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
12330 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
12340 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
12350 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
12360 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
12370 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12380 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12390 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
123a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
123b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
123c0 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
123d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
123e0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
123f0 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
12400 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
12410 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
12420 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
12430 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
12440 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
12450 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
12460 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
12470 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
12480 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
12490 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
124a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
124b0 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
124c0 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
124d0 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
124e0 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
124f0 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
12500 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
12510 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
12520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12530 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12540 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
12550 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12560 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12570 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
12580 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12590 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
125a0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
125b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
125c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
125d0 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
125e0 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
125f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
12600 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
12610 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
12620 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
12630 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
12640 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
12650 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
12660 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
12670 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12680 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
12690 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
126a0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
126b0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
126c0 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
126d0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
126e0 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
126f0 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
12700 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
12710 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
12720 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
12730 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
12740 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
12750 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
12760 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
12770 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
12780 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
12790 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
127a0 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
127b0 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
127c0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
127d0 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
127e0 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
127f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
12800 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
12810 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
12820 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
12830 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
12840 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
12850 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
12860 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
12870 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
12880 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
12890 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
128a0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
128b0 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
128c0 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
128d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
128e0 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
128f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12900 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
12910 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
12920 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
12930 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12940 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
12950 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
12960 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12970 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12980 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
12990 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
129a0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
129b0 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
129c0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
129d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
129e0 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
129f0 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
12a00 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
12a10 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
12a20 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
12a30 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
12a40 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
12a50 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
12a60 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
12a90 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
12aa0 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
12ab0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
12ac0 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
12ad0 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
12ae0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
12af0 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
12b00 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
12b10 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
12b20 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
12b30 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
12b40 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
12b50 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
12b60 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
12b70 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
12b80 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
12b90 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
12ba0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
12bb0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
12bc0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
12bd0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
12be0 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
12bf0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
12c00 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
12c10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12c30 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
12c40 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
12c50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12c60 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
12c70 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
12c80 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
12c90 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
12ca0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
12cb0 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
12cc0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
12cd0 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
12ce0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
12cf0 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
12d00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12d10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12d20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12d30 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
12d40 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
12d50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
12d60 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
12d70 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
12d80 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
12d90 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
12da0 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
12db0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12dc0 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
12dd0 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
12de0 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
12df0 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
12e00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12e10 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
12e20 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
12e30 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
12e40 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
12e50 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
12e60 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
12e70 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
12e80 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
12e90 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
12ea0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
12eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
12ec0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
12ee0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12ef0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12f00 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
12f10 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
12f20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
12f30 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
12f40 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
12f50 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
12f60 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
12f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12f80 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
12f90 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
12fa0 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
12fb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
12fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
12fd0 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
12fe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12ff0 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
13000 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
13010 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
13020 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
13030 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
13040 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
13050 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
13060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
13080 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
13090 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
130a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
130b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
130c0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
130d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
130e0 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
130f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13100 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13120 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
13130 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13140 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
13150 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
13160 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
13170 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
13180 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
13190 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
131a0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
131b0 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
131c0 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
131d0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
131e0 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
131f0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
13200 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
13210 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
13220 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
13230 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
13240 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
13250 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
13260 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
13270 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
13280 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
13290 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
132a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
132b0 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
132c0 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
132d0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
132e0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
132f0 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
13300 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
13310 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
13320 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
13330 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
13340 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
13350 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
13360 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
13370 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13380 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13390 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
133a0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
133b0 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
133c0 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
133d0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
133e0 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
133f0 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
13400 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
13410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
13420 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
13430 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
13440 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
13450 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
13460 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
13470 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
13480 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
13490 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
134a0 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
134b0 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
134c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
134d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
134e0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
134f0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
13500 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
13510 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
13520 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
13530 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13540 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
13550 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
13570 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
13580 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
13590 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
135a0 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
135b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
135c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
135d0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
135e0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
135f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
13600 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
13610 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13620 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
13630 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13640 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
13650 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
13660 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
13670 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
13680 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
13690 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
136a0 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
136b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
136c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
136d0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
136e0 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
136f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
13700 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
13710 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
13720 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
13730 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
13740 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
13750 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
13760 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
13770 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
13780 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
13790 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
137a0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
137b0 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
137c0 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
137d0 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
137e0 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
137f0 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
13800 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
13810 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
13820 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
13830 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
13840 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
13850 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
13860 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
13870 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
13880 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
13890 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
138a0 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
138b0 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
138c0 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
138d0 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
138e0 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
138f0 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
13900 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
13910 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
13920 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
13930 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
13940 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
13950 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
13960 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13970 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
13980 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
13990 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
139a0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
139b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
139c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
139d0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
139e0 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
139f0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
13a00 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
13a10 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
13a20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
13a30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
13a40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13a50 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
13a60 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
13a70 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
13a80 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
13a90 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
13aa0 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
13ab0 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
13ac0 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
13ad0 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
13ae0 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
13af0 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
13b00 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
13b10 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
13b20 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
13b30 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
13b40 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
13b50 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
13b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
13b70 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
13b80 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
13b90 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13ba0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
13bb0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
13bc0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
13bd0 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
13be0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
13bf0 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
13c00 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
13c10 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
13c20 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
13c30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
13c40 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
13c50 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
13c60 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
13c70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
13c80 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
13c90 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
13ca0 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
13cb0 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
13cc0 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
13cd0 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
13ce0 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
13cf0 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
13d00 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
13d10 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
13d20 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
13d30 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
13d40 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
13d50 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
13d60 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
13d70 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
13d80 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
13d90 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
13da0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
13db0 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
13dc0 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
13dd0 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
13de0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
13df0 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
13e00 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
13e10 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13e20 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
13e30 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
13e40 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
13e50 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
13e60 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
13e70 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
13e80 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13e90 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
13ea0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
13eb0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
13ec0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
13ed0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
13ee0 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
13ef0 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
13f00 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  _OK..*/.static S
13f10 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
13f20 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  nt vdbeCloseStat
13f30 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
13f40 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
13f50 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
13f60 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
13f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
13f80 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  t i;.  const int
13f90 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
13fa0 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
13fb0 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
13fc0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13fd0 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
13fe0 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
13ff0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
14000 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
14010 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
14020 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
14030 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
14040 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69  int) );..  for(i
14050 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
14060 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63  ++){ .    int rc
14070 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
14080 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
14090 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
140a0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
140b0 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
140c0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
140d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
140e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
140f0 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
14100 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
14110 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
14120 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14130 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
14140 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
14150 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
14160 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
14170 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
14180 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
14190 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
141a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
141b0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
141c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
141d0 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  }.  db->nStateme
141e0 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74  nt--;.  p->iStat
141f0 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ement = 0;..  if
14200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14210 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  ){.    if( eOp==
14220 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14230 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
14240 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
14250 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
14260 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
14270 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
14280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
142a0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
142b0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
142c0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
142d0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
142e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
142f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
14300 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
14310 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
14320 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
14330 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
14340 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
14350 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
14360 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
14370 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
14380 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
14390 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
143a0 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
143b0 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
143c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
143d0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
143e0 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
143f0 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  efCons;.    db->
14400 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
14410 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
14420 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74  mCons;.  }.  ret
14430 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
14440 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
14450 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
14460 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28   int eOp){.  if(
14470 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65   p->db->nStateme
14480 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
14490 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ent ){.    retur
144a0 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  n vdbeCloseState
144b0 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20  ment(p, eOp);.  
144c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
144d0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
144e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
144f0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
14500 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
14510 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
14520 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
14530 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14540 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
14550 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
14560 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
14570 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
14580 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
14590 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
145a0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
145b0 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
145c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
145d0 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
145e0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
145f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
14600 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
14610 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
14620 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
14630 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
14640 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
14650 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
14660 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
14670 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
14680 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
14690 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
146a0 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
146b0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
146c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
146d0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
146e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
146f0 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
14700 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
14710 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
14720 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
14730 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
14740 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
14750 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
14760 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
14770 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
14780 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
14790 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
147a0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
147b0 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
147c0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
147d0 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
147e0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
147f0 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
14800 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
14810 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
14820 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14830 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14840 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
14850 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14860 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
14870 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
14880 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
14890 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
148a0 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
148b0 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
148c0 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
148d0 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
148e0 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
148f0 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
14900 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
14910 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
14920 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
14930 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
14940 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
14950 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
14960 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
14970 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
14980 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
14990 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
149a0 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
149b0 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
149c0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
149d0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
149e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
149f0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
14a00 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
14a10 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
14a20 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
14a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14a40 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
14a50 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
14a60 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
14a70 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
14a80 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
14a90 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
14aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14ab0 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
14ac0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
14af0 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
14b00 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
14b10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
14b20 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
14b30 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
14b40 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
14b50 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
14b60 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
14b70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
14b80 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
14b90 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
14ba0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
14bb0 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
14bc0 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
14bd0 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
14be0 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
14bf0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
14c00 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
14c10 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
14c20 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
14c30 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
14c40 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
14c50 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
14c60 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
14c70 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
14c80 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
14c90 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
14ca0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
14cb0 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
14cc0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
14cd0 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
14ce0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
14cf0 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
14d00 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
14d10 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
14d20 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
14d30 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
14d40 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
14d50 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
14d60 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
14d70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14d80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
14d90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14da0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
14db0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14dc0 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  KPT;.  }.  close
14dd0 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
14de0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
14df0 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
14e00 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
14e10 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
14e20 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
14e30 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
14e40 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
14e50 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
14e60 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
14e70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
14e80 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
14e90 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
14ea0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
14eb0 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
14ec0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
14ed0 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
14ee0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
14ef0 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
14f00 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
14f10 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
14f20 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
14f30 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
14f40 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
14f50 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
14f60 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
14f70 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
14f80 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
14f90 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
14fa0 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
14fb0 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
14fc0 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
14fd0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
14fe0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
14ff0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
15000 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
15020 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
15030 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
15040 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
15050 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
15060 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
15070 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
15080 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
15090 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
150a0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
150b0 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
150c0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
150d0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
150e0 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
150f0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
15100 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
15110 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
15120 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
15130 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
15140 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
15150 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
15160 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
15170 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
15180 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
15190 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
151a0 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
151b0 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
151c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
151d0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
151e0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
151f0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
15200 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
15210 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
15220 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
15230 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
15240 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
15250 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
15260 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
15270 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
15280 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
15290 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
152a0 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
152b0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
152c0 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
152d0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
152e0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
152f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15300 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
15310 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
15320 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
15330 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
15340 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
15350 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
15360 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
15370 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
15380 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
15390 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
153a0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
153b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
153c0 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
153d0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
153e0 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
153f0 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
15400 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
15410 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
15420 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
15430 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
15440 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
15450 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
15460 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15470 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
15480 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
15490 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
154a0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
154b0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
154c0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
154d0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
154e0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
154f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
15500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15510 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
15520 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
15530 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
15540 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
15550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15570 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
15580 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
15590 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
155a0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
155b0 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
155c0 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
155d0 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
155e0 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
155f0 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
15600 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
15610 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
15620 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
15630 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
15640 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
15650 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
15660 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
15670 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
15680 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
15690 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
156a0 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
156b0 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
156c0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
156d0 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
156e0 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
156f0 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
15700 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
15710 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
15720 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
15730 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
15740 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
15750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15760 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
15770 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
157a0 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
157b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
157c0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
157d0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
157e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
157f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
15800 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
15810 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
15820 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
15830 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
15840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15850 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
15860 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
15870 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
15880 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
15890 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
158a0 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
158b0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
158c0 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
158d0 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
158e0 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
158f0 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
15900 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15910 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
15920 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
15930 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
15940 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
15950 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
15960 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
15970 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15980 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
15990 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
159a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
159b0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
159c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
159d0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
159e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
159f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a00 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
15a10 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
15a20 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
15a30 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
15a40 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
15a50 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
15a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15a70 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
15a80 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
15a90 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
15aa0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
15ab0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
15ac0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
15ad0 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
15ae0 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
15af0 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
15b00 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
15b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15b20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
15b30 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
15b40 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
15b50 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15b60 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
15b70 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
15b80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
15b90 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
15ba0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
15bb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
15bc0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
15bd0 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
15be0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
15bf0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
15c00 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
15c10 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
15c20 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
15c30 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
15c40 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
15c50 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
15c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15c70 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
15c80 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
15c90 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
15ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
15cb0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
15cc0 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
15cd0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
15ce0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
15cf0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
15d00 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
15d10 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
15d20 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
15d30 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
15d40 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
15d50 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
15d60 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
15d70 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
15d80 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
15d90 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
15da0 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
15db0 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
15dc0 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
15dd0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
15de0 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
15df0 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
15e00 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
15e10 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
15e20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
15e30 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
15e40 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
15e50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15e60 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
15e70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15e80 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
15e90 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
15ea0 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
15eb0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
15ec0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15ed0 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
15ee0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
15ef0 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
15f00 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
15f10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15f20 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
15f30 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
15f40 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
15f50 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
15f60 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
15f70 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
15f80 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
15f90 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
15fa0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15fb0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15fc0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15fd0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
15fe0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15ff0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
16000 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
16010 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
16020 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
16030 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
16040 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
16050 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
16060 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
16070 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16080 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
16090 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
160a0 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
160b0 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
160c0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
160d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
160e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
160f0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
16100 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
16110 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
16120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16130 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
16140 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
16150 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
16160 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
16170 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
16180 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
16190 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
161a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
161b0 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
161c0 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
161d0 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
161e0 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
161f0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
16200 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
16210 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
16220 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
16230 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
16240 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
16250 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
16260 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
16270 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
16280 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
16290 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
162a0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
162b0 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
162c0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
162d0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
162e0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
162f0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
16300 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
16310 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
16320 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
16330 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
16340 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
16350 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
16360 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
16370 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
16380 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
16390 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
163a0 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
163b0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
163c0 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
163d0 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
163e0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
163f0 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
16400 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
16410 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
16420 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
16430 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
16440 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
16450 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
16460 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
16470 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
16480 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
16490 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
164a0 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
164b0 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
164c0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
164d0 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
164e0 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
164f0 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
16500 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
16510 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
16520 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
16530 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
16540 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
16550 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
16560 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
16570 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
16580 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16590 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
165a0 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
165b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
165c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
165d0 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
165e0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
165f0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
16600 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
16610 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
16620 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
16630 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16640 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
16650 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
16660 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
16670 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
16680 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
16690 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
166a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
166b0 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
166c0 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
166d0 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
166e0 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
166f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
16700 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
16710 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
16720 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
16730 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16740 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
16750 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
16760 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
16770 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
16780 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  loc++;.    sqlit
16790 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
167a0 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
167b0 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
167c0 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
167d0 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
167e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
167f0 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
16800 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
16810 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
16820 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
16830 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
16840 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
16850 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
16860 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c--;.  }else if(
16870 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
16880 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
16890 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Null(db->pErr);.
168a0 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64    }.  db->errCod
168b0 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  e = rc;.  return
168c0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
168d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
168e0 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  LOG./*.** If an 
168f0 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
16900 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67  LLOG hook is reg
16910 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20  istered and the 
16920 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c  VM has been run,
16930 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a   .** invoke it..
16940 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
16950 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
16960 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
16970 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16980 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76  fig.xSqllog && v
16990 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
169a0 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d  && v->zSql && v-
169b0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68  >pc>=0 ){.    ch
169c0 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20  ar *zExpanded = 
169d0 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e  sqlite3VdbeExpan
169e0 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29  dSql(v, v->zSql)
169f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d  ;.    assert( v-
16a00 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d  >db->init.busy==
16a10 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  0 );.    if( zEx
16a20 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20  panded ){.      
16a30 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16a40 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20  fig.xSqllog(.   
16a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
16a60 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
16a70 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45  ogArg, v->db, zE
16a80 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20  xpanded, 1.     
16a90 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16aa0 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a  3DbFree(v->db, z
16ab0 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d  Expanded);.    }
16ac0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
16ad0 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65  efine vdbeInvoke
16ae0 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66  Sqllog(x).#endif
16af0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
16b00 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
16b10 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
16b20 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
16b30 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
16b40 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
16b50 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
16b60 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
16b70 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
16b80 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
16b90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
16ba0 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
16bb0 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
16bc0 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
16bd0 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
16be0 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
16bf0 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
16c00 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
16c10 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
16c20 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
16c30 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
16c40 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
16c50 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
16c60 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
16c70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16c80 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
16c90 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
16ca0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
16cb0 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
16cc0 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
16cd0 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
16ce0 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
16cf0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
16d00 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
16d10 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
16d20 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
16d30 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
16d40 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
16d50 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
16d60 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
16d70 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
16d80 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
16d90 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
16da0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
16db0 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
16dc0 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
16dd0 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
16de0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
16df0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
16e00 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
16e10 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
16e20 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
16e30 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
16e40 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
16e50 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
16e60 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
16e70 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
16e80 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
16e90 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
16ea0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
16eb0 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
16ec0 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
16ed0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
16ee0 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
16ef0 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
16f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
16f10 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
16f20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
16f30 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
16f40 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
16f50 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
16f60 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
16f70 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
16f80 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
16f90 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
16fa0 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
16fb0 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
16fc0 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
16fd0 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
16fe0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
16ff0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
17000 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
17010 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
17020 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
17030 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
17040 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
17050 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
17060 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
17070 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  ->zErrMsg);.  }.
17080 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67 69  .  /* Reset regi
17090 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e  ster contents an
170a0 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72 20  d reclaim error 
170b0 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e 0a  message memory..
170c0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
170d0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
170e0 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
170f0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
17100 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
17110 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
17120 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
17130 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
17140 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
17150 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70   up.  */.  if( p
17160 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d  ->apCsr ) for(i=
17170 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
17180 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
17190 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
171a0 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
171b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
171c0 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
171d0 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
171e0 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65  .flags==MEM_Unde
171f0 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e  fined );.  }.#en
17200 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
17210 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
17220 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
17230 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
17240 75 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69 66 64  ultSet = 0;.#ifd
17250 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17260 20 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20 30 3b    p->nWrite = 0;
17270 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 61  .#endif..  /* Sa
17280 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
17290 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
172a0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
172b0 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
172c0 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
172d0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
172e0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
172f0 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
17300 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 66  ( out ){.      f
17310 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
17320 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
17330 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
17340 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
17350 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
17360 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
17370 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
17380 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
17390 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
173a0 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
173b0 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
173c0 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
173d0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
173e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
173f0 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
17400 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
17410 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
17420 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
17430 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
17440 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
17450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
17460 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
17470 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
17480 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
17490 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
174a0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
174b0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
174c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
174d0 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
174e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
174f0 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
17500 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
17510 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
17520 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
17530 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
17540 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
17550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
17560 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
17570 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
17580 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
17590 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
175a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
175b0 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
175c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
175d0 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
175e0 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
175f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
17600 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
17610 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
17620 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
17630 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75  IC_RESET;.  retu
17640 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
17650 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
17660 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
17670 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
17680 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
17690 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
176a0 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
176b0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
176c0 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
176d0 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
176e0 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
176f0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
17700 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
17710 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17720 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
17730 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
17740 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
17750 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
17760 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
17770 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
17780 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
17790 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
177a0 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
177b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
177c0 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
177d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
177e0 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20  f parameter iOp 
177f0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
17800 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  o, then invoke t
17810 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
17820 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61  r.** all auxilia
17830 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
17840 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
17850 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
17860 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72  ed as.** the fir
17870 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
17880 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73  ** Or, if iOp is
17890 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
178a0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
178b0 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63  then the destruc
178c0 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69  tor is.** only i
178d0 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65  nvoked for those
178e0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
178f0 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64  pointers created
17900 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a   by the user .**
17910 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
17920 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63  d by the OP_Func
17930 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69  tion opcode at i
17940 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f  nstruction iOp o
17950 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20  f .** VM pVdbe, 
17960 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66  and only then if
17970 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
17980 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63   associated func
17990 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69  tion parameter i
179a0 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61  s the 32nd or la
179b0 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a  ter (counting.**
179c0 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20        from left 
179d0 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a  to right), or.**
179e0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72  .**    * the cor
179f0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
17a00 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20  n argument mask 
17a10 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20  is clear (where 
17a20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20  the first.**    
17a30 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d    function param
17a40 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  eter corresponds
17a50 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e   to bit 0 etc.).
17a60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17a70 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
17a80 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  a(sqlite3 *db, A
17a90 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74  uxData **pp, int
17aa0 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b   iOp, int mask){
17ab0 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
17ac0 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
17ad0 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
17ae0 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
17af0 7c 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d  | (pAux->iAuxOp=
17b00 3d 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20 26  =iOp.          &
17b10 26 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e  & pAux->iAuxArg>
17b20 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
17b30 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 33  (pAux->iAuxArg>3
17b40 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41  1 || !(mask & MA
17b50 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41  SKBIT32(pAux->iA
17b60 75 78 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b  uxArg)))).    ){
17b70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17b80 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d   pAux->iAuxArg==
17b90 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  31 );.      if( 
17ba0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78  pAux->xDeleteAux
17bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
17bc0 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41 75  ->xDeleteAux(pAu
17bd0 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
17be0 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41  }.      *pp = pA
17bf0 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20  ux->pNextAux;.  
17c00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17c10 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  e(db, pAux);.   
17c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
17c30 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41 75  = &pAux->pNextAu
17c40 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  x;.    }.  }.}..
17c50 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
17c60 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
17c70 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
17c80 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
17c90 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
17ca0 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
17cb0 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
17cc0 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
17cd0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
17ce0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
17cf0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
17d00 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
17d10 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
17d20 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
17d30 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
17d40 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
17d50 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
17d60 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
17d70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17d80 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
17d90 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
17da0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
17db0 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
17dc0 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
17dd0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
17de0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
17df0 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
17e00 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
17e10 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
17e20 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
17e30 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
17e40 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
17e50 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
17e60 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
17e70 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
17e80 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
17e90 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
17ea0 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
17eb0 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
17ec0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17ed0 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
17ee0 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
17ef0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
17f00 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
17f10 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
17f20 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71 6c  ->nVar);.    sql
17f30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17f40 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pVList);.    s
17f50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17f60 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a   p->pFree);.  }.
17f70 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
17f80 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
17f90 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
17fa0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
17fb0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
17fc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
17fd0 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  zSql);.#ifdef SQ
17fe0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
17ff0 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a  _SCANSTATUS.  {.
18000 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
18010 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63  or(i=0; i<p->nSc
18020 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  an; i++){.      
18030 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18040 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e  , p->aScan[i].zN
18050 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
18060 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18070 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d  , p->aScan);.  }
18080 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
18090 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
180a0 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
180b0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
180c0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
180d0 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 61 73  lite3 *db;..  as
180e0 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
180f0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
18100 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18110 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
18120 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
18130 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
18140 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
18150 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
18160 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
18170 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
18180 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
18190 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
181a0 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
181b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
181c0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
181d0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
181e0 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
181f0 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
18200 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
18210 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
18220 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
18230 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
18240 20 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20   The cursor "p" 
18250 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65  has a pending se
18260 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  ek operation tha
18270 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
18280 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75  en.** carried ou
18290 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72  t.  Seek the cur
182a0 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20  sor now.  If an 
182b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
182c0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72  turn.** the appr
182d0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
182e0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
182f0 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
18300 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  E handleDeferred
18310 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
18320 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73  r *p){.  int res
18330 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
18340 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
18350 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
18360 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
18370 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
18380 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
18390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
183a0 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  sTable );.  asse
183b0 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
183c0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
183d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
183e0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
183f0 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ked(p->uc.pCurso
18400 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
18410 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b  arget, 0, &res);
18420 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
18430 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73  rn rc;.  if( res
18440 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
18450 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18460 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18470 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73  TEST.  sqlite3_s
18480 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
18490 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72  endif.  p->defer
184a0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
184b0 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
184c0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
184d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
184e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  K;.}../*.** Some
184f0 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20  thing has moved 
18500 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f  cursor "p" out o
18510 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20  f place.  Maybe 
18520 74 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a  the row it was.*
18530 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73  * pointed to was
18540 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
18550 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20  m under it.  Or 
18560 6d 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20  maybe the btree 
18570 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65  was.** rebalance
18580 64 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65  d.  Whatever the
18590 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72   cause, try to r
185a0 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68  estore "p" to th
185b0 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73  e place it.** is
185c0 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20   supposed to be 
185d0 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68  pointing.  If th
185e0 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65  e row was delete
185f0 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
18600 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20   the.** cursor, 
18610 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74  set the cursor t
18620 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c  o point to a NUL
18630 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  L row..*/.static
18640 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
18650 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64  LINE handleMoved
18660 43 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f  Cursor(VdbeCurso
18670 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44  r *p){.  int isD
18680 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b  ifferentRow, rc;
18690 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
186a0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
186b0 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
186c0 74 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t( p->uc.pCursor
186d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
186e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
186f0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
18700 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  c.pCursor) );.  
18710 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18720 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70  eCursorRestore(p
18730 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69  ->uc.pCursor, &i
18740 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a  sDifferentRow);.
18750 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
18760 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
18770 20 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e    if( isDifferen
18780 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f  tRow ) p->nullRo
18790 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  w = 1;.  return 
187a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
187b0 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ck to ensure tha
187c0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
187d0 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20  valid.  Restore 
187e0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66  the cursor.** if
187f0 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72   need be.  Retur
18800 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20  n any I/O error 
18810 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65  from the restore
18820 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69   operation..*/.i
18830 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
18840 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65  rsorRestore(Vdbe
18850 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73  Cursor *p){.  as
18860 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
18870 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
18880 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
18890 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
188a0 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
188b0 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
188c0 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
188d0 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
188e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
188f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
18900 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
18910 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
18920 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
18930 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
18940 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
18950 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
18960 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
18970 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
18980 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
18990 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
189a0 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
189b0 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
189c0 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
189d0 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
189e0 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
189f0 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
18a00 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
18a10 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
18a20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
18a30 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
18a40 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
18a50 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
18a60 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
18a70 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
18a80 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
18a90 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
18aa0 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
18ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
18ac0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
18ad0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
18ae0 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
18af0 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
18b00 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
18b10 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
18b20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
18b30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18b40 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
18b50 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
18b60 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
18b70 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70  sor **pp, int *p
18b80 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72  iCol){.  VdbeCur
18b90 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  sor *p = *pp;.  
18ba0 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
18bb0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
18bc0 45 45 20 7c 7c 20 70 2d 3e 65 43 75 72 54 79 70  EE || p->eCurTyp
18bd0 65 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44  e==CURTYPE_PSEUD
18be0 4f 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 65  O );.  if( p->de
18bf0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
18c00 20 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20      int iMap;.  
18c10 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70    if( p->aAltMap
18c20 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61   && (iMap = p->a
18c30 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d  AltMap[1+*piCol]
18c40 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  )>0 ){.      *pp
18c50 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72   = p->pAltCursor
18c60 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d  ;.      *piCol =
18c70 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20   iMap - 1;.     
18c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18c90 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
18ca0 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72  urn handleDeferr
18cb0 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d  edMoveto(p);.  }
18cc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74  .  if( sqlite3Bt
18cd0 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
18ce0 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
18cf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
18d00 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
18d10 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
18d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18d30 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
18d40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
18d50 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
18d60 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
18d70 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18d80 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
18d90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
18da0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
18db0 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a  dbeSerialPut().*
18dc0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
18dd0 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65  ialGet().**.** e
18de0 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
18df0 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
18e00 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
18e10 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
18e20 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
18e30 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
18e40 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
18e50 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
18e60 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
18e70 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
18e80 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
18e90 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
18ea0 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
18eb0 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
18ec0 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
18ed0 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
18ee0 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
18ef0 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
18f00 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
18f10 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
18f20 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
18f30 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
18f40 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
18f50 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
18f60 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
18f70 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
18f80 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
18f90 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
18fa0 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
18fb0 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
18fc0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
18fd0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
18fe0 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
18ff0 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
19000 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c  a blob separatel
19010 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
19020 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
19030 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
19040 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
19050 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
19060 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
19070 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
19080 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
19090 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
190a0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
190b0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
190c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
190d0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
190e0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
190f0 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
19100 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
19110 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
19120 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
19130 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
19160 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19170 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
19190 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
191a0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
191b0 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
191c0 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
191d0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
191e0 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
19210 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19220 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
19230 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
19240 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
19250 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
19280 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
19290 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
192a0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
192b0 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
192c0 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
192d0 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
192e0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
192f0 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
19300 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
19310 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
19340 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
19350 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
19360 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
19370 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
19380 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
19390 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
193a0 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
193b0 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
193c0 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
193d0 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
193e0 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
193f0 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
19400 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
19410 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
19420 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
19430 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19440 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
19450 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
19460 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
19470 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
19480 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
19490 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
194a0 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a  at, u32 *pLen){.
194b0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
194c0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32  em->flags;.  u32
194d0 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   n;..  assert( p
194e0 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Len!=0 );.  if( 
194f0 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
19500 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b  {.    *pLen = 0;
19510 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19520 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
19530 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
19540 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
19550 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
19560 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
19570 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
19580 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
19590 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
195a0 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
195b0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
195c0 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
195d0 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d  i<0 ){.      u =
195e0 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ~i;.    }else{.
195f0 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20        u = i;.   
19600 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32   }.    if( u<=12
19610 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  7 ){.      if( (
19620 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
19630 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
19640 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a       *pLen = 0;.
19650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38          return 8
19660 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d  +(u32)u;.      }
19670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
19680 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Len = 1;.       
19690 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
196a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
196b0 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c   u<=32767 ){ *pL
196c0 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32  en = 2; return 2
196d0 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38  ; }.    if( u<=8
196e0 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20  388607 ){ *pLen 
196f0 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d  = 3; return 3; }
19700 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
19710 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20  483647 ){ *pLen 
19720 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d  = 4; return 4; }
19730 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
19740 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d  6BYTE ){ *pLen =
19750 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a   6; return 5; }.
19760 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
19770 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
19780 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
19790 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Real ){.    *pL
197a0 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
197b0 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
197c0 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
197d0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
197e0 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
197f0 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
19800 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
19810 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
19820 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
19830 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
19840 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
19850 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70  .nZero;.  }.  *p
19860 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  Len = n;.  retur
19870 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
19880 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
19890 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
198a0 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65  The sizes for se
198b0 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20  rial types less 
198c0 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74  than 128.*/.stat
198d0 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69  ic const u8 sqli
198e0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
198f0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
19900 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20  /*  0   1   2   
19910 33 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20  3   4   5   6   
19920 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a  7   8   9 */   .
19930 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20  /*   0 */   0,  
19940 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20  1,  2,  3,  4,  
19950 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20  6,  8,  8,  0,  
19960 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30  0,./*  10 */   0
19970 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
19980 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33  ,  1,  2,  2,  3
19990 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20  ,  3,./*  20 */ 
199a0 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c    4,  4,  5,  5,
199b0 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c    6,  6,  7,  7,
199c0 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20    8,  8,./*  30 
199d0 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20  */   9,  9, 10, 
199e0 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20  10, 11, 11, 12, 
199f0 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20  12, 13, 13,./*  
19a00 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31  40 */  14, 14, 1
19a10 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31  5, 15, 16, 16, 1
19a20 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f  7, 17, 18, 18,./
19a30 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39  *  50 */  19, 19
19a40 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31  , 20, 20, 21, 21
19a50 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33  , 22, 22, 23, 23
19a60 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c  ,./*  60 */  24,
19a70 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c   24, 25, 25, 26,
19a80 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c   26, 27, 27, 28,
19a90 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20   28,./*  70 */  
19aa0 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20  29, 29, 30, 30, 
19ab0 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20  31, 31, 32, 32, 
19ac0 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a  33, 33,./*  80 *
19ad0 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33  /  34, 34, 35, 3
19ae0 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33  5, 36, 36, 37, 3
19af0 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39  7, 38, 38,./*  9
19b00 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30  0 */  39, 39, 40
19b10 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32  , 40, 41, 41, 42
19b20 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a  , 42, 43, 43,./*
19b30 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c   100 */  44, 44,
19b40 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c   45, 45, 46, 46,
19b50 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c   47, 47, 48, 48,
19b60 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20  ./* 110 */  49, 
19b70 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20  49, 50, 50, 51, 
19b80 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20  51, 52, 52, 53, 
19b90 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35  53,./* 120 */  5
19ba0 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35  4, 54, 55, 55, 5
19bb0 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b  6, 56, 57, 57.};
19bc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
19bd0 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
19be0 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
19bf0 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
19c00 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
19c10 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
19c20 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19c30 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
19c40 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
19c50 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20  type>=128 ){.   
19c60 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
19c70 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
19c80 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
19c90 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
19ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
19cb0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
19cc0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
19cd0 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65  e]==(serial_type
19ce0 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20   - 12)/2 );.    
19cf0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d  return sqlite3Sm
19d00 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
19d10 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
19d20 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f  .u8 sqlite3VdbeO
19d30 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65  neByteSerialType
19d40 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79  Len(u8 serial_ty
19d50 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
19d60 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29  erial_type<128 )
19d70 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
19d80 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
19d90 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20  [serial_type];  
19da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
19db0 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
19dc0 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
19dd0 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
19de0 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
19df0 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
19e00 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
19e10 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
19e20 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
19e30 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
19e40 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
19e50 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
19e60 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
19e70 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
19e80 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
19e90 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
19ea0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
19eb0 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
19ec0 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
19ed0 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
19ee0 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
19ef0 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
19f00 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
19f10 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
19f20 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
19f30 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
19f40 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
19f50 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
19f60 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
19f70 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
19f80 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
19f90 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
19fa0 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
19fb0 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
19fc0 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
19fd0 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
19fe0 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
19ff0 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
1a000 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
1a010 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
1a020 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
1a030 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
1a040 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
1a050 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
1a060 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
1a070 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
1a080 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
1a090 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
1a0a0 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
1a0b0 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
1a0c0 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
1a0d0 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
1a0e0 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
1a0f0 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
1a100 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
1a110 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
1a120 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
1a130 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1a140 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
1a150 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
1a160 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
1a170 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
1a180 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
1a190 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
1a1a0 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
1a1b0 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
1a1c0 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
1a1d0 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
1a1e0 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
1a1f0 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
1a200 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
1a210 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
1a220 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
1a230 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
1a240 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
1a250 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
1a260 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
1a270 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
1a280 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
1a290 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
1a2a0 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
1a2b0 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
1a2c0 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
1a2d0 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
1a2e0 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
1a2f0 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
1a300 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
1a310 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
1a320 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
1a330 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
1a340 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
1a350 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
1a360 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
1a370 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
1a380 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
1a390 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
1a3a0 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
1a3b0 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
1a3c0 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
1a3d0 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
1a3e0 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
1a3f0 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
1a400 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
1a410 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
1a420 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
1a430 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
1a440 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
1a450 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
1a460 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
1a470 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
1a480 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
1a490 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
1a4a0 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
1a4b0 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
1a4c0 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
1a4d0 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
1a4e0 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
1a4f0 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
1a500 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1a510 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
1a520 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
1a530 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
1a540 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
1a550 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
1a560 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
1a570 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
1a580 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
1a590 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
1a5a0 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
1a5b0 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
1a5c0 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
1a5d0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1a5e0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
1a5f0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a600 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
1a610 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
1a620 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
1a630 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20   in buf[].  The 
1a640 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1a650 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c  sible.** for all
1a660 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73  ocating enough s
1a670 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f  pace to buf[] to
1a680 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
1a690 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76   field, exclusiv
1a6a0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d  e.** of the pMem
1a6b0 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20  ->u.nZero bytes 
1a6c0 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76  for a MEM_Zero v
1a6d0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alue..**.** Retu
1a6e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1a6f0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
1a700 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
1a710 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
1a720 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
1a730 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
1a740 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
1a750 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
1a760 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
1a770 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
1a780 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
1a790 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
1a7a0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
1a7b0 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   *buf, Mem *pMem
1a7c0 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  , u32 serial_typ
1a7d0 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  e){.  u32 len;..
1a7e0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
1a7f0 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
1a800 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
1a810 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
1a820 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
1a830 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
1a840 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1a850 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a860 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
1a870 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a  f(pMem->u.r) );.
1a880 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
1a890 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a   &pMem->u.r, siz
1a8a0 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
1a8b0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1a8c0 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
1a8d0 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
1a8e0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
1a8f0 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
1a900 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
1a910 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
1a920 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
1a930 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
1a940 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29   buf[--i] = (u8)
1a950 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
1a960 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68  v >>= 8;.    }wh
1a970 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65  ile( i );.    re
1a980 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
1a990 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
1a9a0 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
1a9b0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
1a9c0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
1a9d0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
1a9e0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
1a9f0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1aa10 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
1aa20 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1aa30 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
1aa40 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
1aa50 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29  .    if( len>0 )
1aa60 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
1aa70 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
1aa80 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
1aa90 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
1aaa0 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
1aab0 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1aac0 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73  ./* Input "x" is
1aad0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75   a sequence of u
1aae0 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65  nsigned characte
1aaf0 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  rs that represen
1ab00 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61  t a.** big-endia
1ab10 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75  n integer.  Retu
1ab20 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  rn the equivalen
1ab30 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  t native integer
1ab40 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f  .*/.#define ONE_
1ab50 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
1ab60 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66  (i8)(x)[0]).#def
1ab70 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  ine TWO_BYTE_INT
1ab80 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29  (x)    (256*(i8)
1ab90 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29  ((x)[0])|(x)[1])
1aba0 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42  .#define THREE_B
1abb0 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35  YTE_INT(x)  (655
1abc0 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  36*(i8)((x)[0])|
1abd0 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[1]<<8)|(x)[
1abe0 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  2]).#define FOUR
1abf0 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28  _BYTE_UINT(x)  (
1ac00 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34  ((u32)(x)[0]<<24
1ac10 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
1ac20 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
1ac30 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
1ac40 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37  BYTE_INT(x) (167
1ac50 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30  77216*(i8)((x)[0
1ac60 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  ])|((x)[1]<<16)|
1ac70 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
1ac80 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  3])../*.** Deser
1ac90 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
1aca0 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
1acb0 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
1acc0 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
1acd0 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
1ace0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
1acf0 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
1ad00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1ad10 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
1ad20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
1ad30 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73  emented as two s
1ad40 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73  eparate routines
1ad50 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65   for performance
1ad60 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73  ..** The few cas
1ad70 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  es that require 
1ad80 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
1ad90 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  are broken out i
1ada0 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a  nto a separate.*
1adb0 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  * routine so tha
1adc0 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  t in most cases 
1add0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1ade0 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b  moving the stack
1adf0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61   pointer.** is a
1ae00 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  voided..*/ .stat
1ae10 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f  ic u32 SQLITE_NO
1ae20 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74  INLINE serialGet
1ae30 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
1ae40 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
1ae50 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
1ae60 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
1ae70 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
1ae80 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
1ae90 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1aea0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
1aeb0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
1aee0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
1aef0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75  e into */.){.  u
1af00 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1af10 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33  _UINT(buf);.  u3
1af20 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  2 y = FOUR_BYTE_
1af30 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78  UINT(buf+4);.  x
1af40 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a   = (x<<32) + y;.
1af50 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1af60 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==6 ){.    /* E
1af70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
1af80 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20  851-52272 Value 
1af90 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1afa0 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77  64-bit.    ** tw
1afb0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1afc0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d  teger. */.    pM
1afd0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
1afe0 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
1aff0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1b000 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1b010 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
1b020 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
1b030 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34  DENCE-OF: R-5734
1b040 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73  3-49114 Value is
1b050 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45   a big-endian IE
1b060 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62  EE 754-2008 64-b
1b070 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  it.    ** floati
1b080 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e  ng point number.
1b090 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
1b0a0 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
1b0b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b0c0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
1b0d0 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1b0e0 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
1b0f0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1b100 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
1b110 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20  ame.    ** byte 
1b120 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
1b130 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
1b140 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
1b150 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  OAT is.    ** de
1b160 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
1b170 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
1b180 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
1b190 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20  re mixed.    ** 
1b1a0 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  endian..    */. 
1b1b0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b1c0 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
1b1d0 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
1b1e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1b1f0 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
1b200 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74  ;.    u64 t2 = t
1b210 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  1;.    swapMixed
1b220 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
1b230 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
1b240 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
1b250 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
1b260 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
1b270 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
1b280 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
1b290 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
1b2a0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d  eof(pMem->u.r)==
1b2b0 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
1b2c0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
1b2d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
1b2e0 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a  em->u.r, &x, siz
1b2f0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
1b300 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
1b310 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e  e3IsNaN(pMem->u.
1b320 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
1b330 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  MEM_Real;.  }.  
1b340 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20  return 8;.}.u32 
1b350 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b360 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
1b370 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
1b380 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
1b390 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
1b3a0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
1b3b0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
1b3c0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1b3d0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
1b3e0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
1b3f0 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
1b400 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1b410 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
1b420 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
1b430 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1b440 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1b450 73 65 20 31 30 3a 20 7b 20 2f 2a 20 49 6e 74 65  se 10: { /* Inte
1b460 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 3a 20 4e  rnal use only: N
1b470 55 4c 4c 20 77 69 74 68 20 76 69 72 74 75 61 6c  ULL with virtual
1b480 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
1b490 20 20 20 20 20 20 2a 2a 20 55 50 44 41 54 45 20        ** UPDATE 
1b4a0 6e 6f 2d 63 68 61 6e 67 65 20 66 6c 61 67 20 73  no-change flag s
1b4b0 65 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  et */.      pMem
1b4c0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
1b4d0 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 20  ll|MEM_Zero;.   
1b4e0 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a     pMem->n = 0;.
1b4f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 6e 5a        pMem->u.nZ
1b500 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  ero = 0;.      b
1b510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b520 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
1b530 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
1b540 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
1b550 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20  e 0: {  /* Null 
1b560 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1b570 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38  ENCE-OF: R-24078
1b580 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20  -09375 Value is 
1b590 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20  a NULL. */.     
1b5a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1b5b0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
1b5c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b5d0 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20  case 1: {.      
1b5e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1b5f0 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61  R-44885-25196 Va
1b600 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20  lue is an 8-bit 
1b610 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a  twos-complement.
1b620 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
1b630 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1b640 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f  >u.i = ONE_BYTE_
1b650 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1b660 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1b670 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1b680 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1b690 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1b6a0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1b6b0 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
1b6c0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1b6d0 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1b6e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
1b6f0 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20  794-35026 Value 
1b700 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1b710 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  16-bit.      ** 
1b720 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1b730 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1b740 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57    pMem->u.i = TW
1b750 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1b760 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1b770 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1b780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1b790 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1b7a0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
1b7b0 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
1b7c0 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
1b7d0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1b7e0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1b7f0 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31  F: R-37839-54301
1b800 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1b810 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20  endian 24-bit.  
1b820 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1b830 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1b840 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1b850 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  .i = THREE_BYTE_
1b860 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1b870 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1b880 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1b890 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1b8a0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1b8b0 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
1b8c0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
1b8d0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1b8e0 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1b8f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
1b900 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20  849-26079 Value 
1b910 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1b920 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  32-bit.      ** 
1b930 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1b940 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1b950 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
1b960 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  UR_BYTE_INT(buf)
1b970 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63  ;.#ifdef __HP_cc
1b980 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20   .      /* Work 
1b990 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78  around a sign-ex
1b9a0 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74  tension bug in t
1b9b0 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66  he HP compiler f
1b9c0 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20  or HP/UX */.    
1b9d0 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38    if( buf[0]&0x8
1b9e0 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d  0 ) pMem->u.i |=
1b9f0 20 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30   0xffffffff80000
1ba00 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  000LL;.#endif.  
1ba10 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1ba20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1ba30 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1ba40 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1ba50 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
1ba60 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1ba70 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1ba80 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1ba90 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1baa0 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61  R-50385-09674 Va
1bab0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1bac0 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20  ian 48-bit.     
1bad0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1bae0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1baf0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1bb00 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1bb10 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34  (buf+2) + (((i64
1bb20 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1bb30 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1bb40 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1bb50 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1bb60 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1bb70 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1bb80 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
1bb90 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
1bba0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1bbb0 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
1bbc0 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
1bbd0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
1bbe0 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75        /* These u
1bbf0 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  se local variabl
1bc00 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69  es, so do them i
1bc10 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  n a separate rou
1bc20 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  tine.      ** to
1bc30 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
1bc40 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20   move the frame 
1bc50 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
1bc60 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
1bc70 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61      return seria
1bc80 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f  lGet(buf,serial_
1bc90 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20  type,pMem);.    
1bca0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
1bcb0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
1bcc0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
1bcd0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
1bce0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1bcf0 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32  E-OF: R-12976-22
1bd00 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65  893 Value is the
1bd10 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20   integer 0. */. 
1bd20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1bd30 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31  -OF: R-18143-121
1bd40 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  21 Value is the 
1bd50 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20  integer 1. */.  
1bd60 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1bd70 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
1bd80 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1bd90 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1bda0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1bdb0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1bdc0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1bdd0 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33  CE-OF: R-14606-3
1bde0 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20  1564 Value is a 
1bdf0 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d  BLOB that is (N-
1be00 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20  12)/2 bytes in. 
1be10 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a       ** length..
1be20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
1be30 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30  E-OF: R-28401-00
1be40 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73  140 Value is a s
1be50 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78  tring in the tex
1be60 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20  t encoding and. 
1be70 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32       ** (N-13)/2
1be80 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
1be90 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  . */.      stati
1bea0 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
1beb0 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
1bec0 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
1bed0 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
1bee0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
1bef0 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
1bf00 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
1bf10 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
1bf20 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1bf30 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
1bf40 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
1bf50 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
1bf60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1bf70 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
1bf80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1bf90 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
1bfa0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1bfb0 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
1bfc0 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
1bfd0 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
1bfe0 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
1bff0 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
1c000 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
1c010 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
1c020 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1c030 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
1c040 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
1c050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
1c060 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
1c070 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
1c080 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
1c090 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
1c0a0 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
1c0b0 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
1c0c0 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
1c0d0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
1c0e0 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
1c0f0 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
1c100 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
1c110 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
1c120 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
1c130 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1c140 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
1c150 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
1c160 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
1c170 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
1c180 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
1c190 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
1c1a0 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
1c1b0 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
1c1c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1c1d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1c1e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
1c1f0 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
1c200 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1c210 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
1c220 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
1c230 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
1c240 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
1c250 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20  pKeyInfo        
1c260 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
1c270 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
1c280 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61  ord */.){.  Unpa
1c290 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20  ckedRecord *p;  
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c2b0 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
1c2c0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
1c2d0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2f0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c300 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
1c310 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   */.  nByte = RO
1c320 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1c330 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
1c340 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
1c350 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b  Info->nKeyField+
1c360 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 63  1);.  p = (Unpac
1c370 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
1c380 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
1c390 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
1c3a0 74 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20  te);.  if( !p ) 
1c3b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61  return 0;.  p->a
1c3c0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
1c3d0 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
1c3e0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1c3f0 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
1c400 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1c410 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1c420 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
1c430 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
1c440 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
1c450 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 3b 0a 20  nKeyField + 1;. 
1c460 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1c470 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
1c480 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
1c490 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
1c4a0 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
1c4b0 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
1c4c0 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
1c4d0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1c4e0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
1c4f0 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
1c500 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
1c510 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
1c520 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
1c530 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1c540 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1c550 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
1c560 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
1c570 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
1c580 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5a0 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
1c5b0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
1c5c0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1c5d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
1c5e0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
1c5f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1c600 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
1c610 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
1c620 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1c630 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
1c640 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c650 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1c660 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1c670 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
1c680 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
1c6b0 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
1c6c0 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1c6f0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1c700 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
1c710 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
1c720 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66  >aMem;..  p->def
1c730 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61  ault_rc = 0;.  a
1c740 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1c750 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
1c760 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
1c770 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1c780 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
1c790 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
1c7a0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1c7b0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
1c7c0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1c7d0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
1c7e0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1c7f0 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
1c800 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
1c810 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1c820 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
1c830 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1c840 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
1c850 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
1c860 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1c870 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
1c880 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
1c890 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Mem->szMalloc = 
1c8a0 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  0;.    pMem->z =
1c8b0 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
1c8c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1c8d0 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
1c8e0 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
1c8f0 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
1c900 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46  if( (++u)>=p->nF
1c910 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  ield ) break;.  
1c920 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
1c930 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
1c940 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
1c950 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69  Field = u;.}..#i
1c960 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c970 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
1c980 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1c990 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  wo index or tabl
1c9a0 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e  e record keys in
1c9b0 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a   the same way.**
1c9c0 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56   as the sqlite3V
1c9d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c9e0 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69  () routine. Unli
1c9f0 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  ke VdbeRecordCom
1ca00 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20  pare(),.** this 
1ca10 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1ca20 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72  lizes and compar
1ca30 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20  es values using 
1ca40 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  the.** sqlite3Vd
1ca50 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
1ca60 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  d sqlite3MemComp
1ca70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  are() functions.
1ca80 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69   It is used.** i
1ca90 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1caa0 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
1cab0 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
1cac0 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71  ed code in.** sq
1cad0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1cae0 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73  ompare() returns
1caf0 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
1cb00 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76  ese two primitiv
1cb10 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1cb20 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73   true if the res
1cb30 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
1cb40 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  n is equivalent 
1cb50 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  to desiredResult
1cb60 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
1cb70 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
1cb80 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f  disagreement..*/
1cb90 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1cba0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1cbb0 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ug(.  int nKey1,
1cbc0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1cbd0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
1cbe0 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63  */.  const Unpac
1cbf0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1cc00 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20  2, /* Right key 
1cc10 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64  */.  int desired
1cc20 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
1cc30 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e     /* Correct an
1cc40 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  swer */.){.  u32
1cc50 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1cc60 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1cc70 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1cc80 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1cc90 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1cca0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1ccb0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1ccc0 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
1ccd0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1cce0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ccf0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
1cd00 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
1cd10 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1cd20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
1cd30 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1cd40 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1cd50 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1cd60 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1cd70 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
1cd80 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
1cd90 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1cda0 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1cdb0 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
1cdc0 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  1;.  mem1.enc = 
1cdd0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1cde0 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1cdf0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65  nfo->db;.  /* me
1ce00 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f  m1.flags = 0;  /
1ce10 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  / Will be initia
1ce20 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lized by sqlite3
1ce30 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1ce40 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  */.  VVA_ONLY( m
1ce50 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1ce60 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1ce70 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1ce80 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
1ce90 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
1cea0 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
1ceb0 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
1cec0 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
1ced0 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
1cee0 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
1cef0 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
1cf00 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
1cf10 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
1cf20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
1cf30 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
1cf40 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
1cf50 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
1cf60 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
1cf70 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
1cf80 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
1cf90 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
1cfa0 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
1cfb0 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
1cfc0 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
1cfd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
1cfe0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
1cff0 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
1d000 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
1d010 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
1d020 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
1d030 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
1d040 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1d050 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
1d060 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
1d070 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
1d080 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
1d090 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
1d0a0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1d0b0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1d0c0 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72  r1);.  if( szHdr
1d0d0 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e  1>98307 ) return
1d0e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
1d0f0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
1d100 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1d110 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70  fo->nAllField>=p
1d120 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c  PKey2->nField ||
1d130 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1d140 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1d150 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1d160 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1d170 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1d180 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1d190 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1d1a0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1d1b0 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1d1c0 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
1d1d0 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
1d1e0 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
1d1f0 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
1d200 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
1d210 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
1d220 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
1d230 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
1d240 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
1d250 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  y that there is 
1d260 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65  enough key space
1d270 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76   remaining to av
1d280 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  oid.    ** a buf
1d290 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54  fer overread.  T
1d2a0 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79  he "d1+serial_ty
1d2b0 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73  pe1+2" subexpres
1d2c0 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  sion will.    **
1d2d0 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74   always be great
1d2e0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1d2f0 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   to the amount o
1d300 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73  f required key s
1d310 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65  pace..    ** Use
1d320 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74   that approximat
1d330 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65  ion to avoid the
1d340 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20   more expensive 
1d350 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
1d360 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1d370 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65  TypeLen() in the
1d380 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
1d390 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b    */.    if( d1+
1d3a0 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
1d3b0 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u32)nKey1.     &
1d3c0 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65  & d1+sqlite3Vdbe
1d3d0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1d3e0 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32  rial_type1)>(u32
1d3f0 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
1d400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d410 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
1d420 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
1d430 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
1d440 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
1d450 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1d460 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1d470 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
1d480 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
1d490 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
1d4a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1d4b0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1d4c0 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
1d4d0 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e  >aMem[i], pKeyIn
1d4e0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
1d4f0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1d500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1d510 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1d520 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1d530 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1d540 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1d550 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1d560 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1d570 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
1d580 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
1d590 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
1d5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1d5b0 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
1d5c0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
1d5d0 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
1d5e0 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
1d5f0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
1d600 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1d610 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1d620 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1d630 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1d640 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1d650 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1d660 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1d670 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1d680 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1d690 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1d6a0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1d6b0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1d6c0 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
1d6d0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1d6e0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1d6f0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1d700 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
1d710 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1d720 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1d730 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1d740 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1d750 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1d760 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1d770 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1d780 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
1d790 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1d7a0 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
1d7b0 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
1d7c0 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
1d7d0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1d7e0 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1d7f0 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
1d800 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1d810 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
1d820 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
1d830 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
1d840 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
1d850 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1d860 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d870 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
1d880 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1d890 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1d8a0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  DEBUG./*.** Coun
1d8b0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1d8c0 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63  fields (a.k.a. c
1d8d0 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72  olumns) in the r
1d8e0 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a  ecord given by.*
1d8f0 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68  * pKey,nKey.  Th
1d900 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1d910 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73  is count is less
1d920 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1d930 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67  o the.** limit g
1d940 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f  iven by pKeyInfo
1d950 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a  ->nAllField..**.
1d960 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74  ** If this const
1d970 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74  raint is not sat
1d980 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73  isfied, it means
1d990 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73   that the high-s
1d9a0 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f  peed.** vdbeReco
1d9b0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1d9c0 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nd vdbeRecordCom
1d9d0 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75  pareString() rou
1d9e0 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  tines will.** no
1d9f0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1da00 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72  .  If this asser
1da10 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20  t() ever fires, 
1da20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e  it probably mean
1da30 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65  s.** that the Ke
1da40 79 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20  yInfo.nKeyField 
1da50 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46  or KeyInfo.nAllF
1da60 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65  ield values were
1da70 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63   computed.** inc
1da80 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
1da90 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73  tic void vdbeAss
1daa0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1dab0 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74  hinLimits(.  int
1dac0 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69   nKey, const voi
1dad0 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68  d *pKey,   /* Th
1dae0 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69  e record to veri
1daf0 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b  fy */ .  const K
1db00 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1db10 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1db20 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73  e size with this
1db30 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20   KeyInfo */.){. 
1db40 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b   int nField = 0;
1db50 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
1db60 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e  u32 idx;.  u32 n
1db70 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20  otUsed;.  const 
1db80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1db90 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
1dba0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79  igned char*)pKey
1dbb0 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ;..  if( CORRUPT
1dbc0 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _DB ) return;.  
1dbd0 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1dbe0 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1dbf0 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d    assert( nKey>=
1dc00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1dc10 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20  zHdr<=(u32)nKey 
1dc20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  );.  while( idx<
1dc30 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78  szHdr ){.    idx
1dc40 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1dc50 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65  aKey+idx, notUse
1dc60 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b  d);.    nField++
1dc70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1dc80 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e  nField <= pKeyIn
1dc90 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b  fo->nAllField );
1dca0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1dcb0 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  e vdbeAssertFiel
1dcc0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1dcd0 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66  ts(A,B,C).#endif
1dce0 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d  ../*.** Both *pM
1dcf0 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63  em1 and *pMem2 c
1dd00 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61  ontain string va
1dd10 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68  lues. Compare th
1dd20 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
1dd30 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1dd40 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
1dd50 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65  ll. As usual, re
1dd60 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1dd70 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1dd80 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a  itive value if *
1dd90 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1dda0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1ddb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1ddc0 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74   *pMem2, respect
1ddd0 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69  ively. Similar i
1dde0 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20  n spirit to "rc 
1ddf0 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70  = (*pMem1) - (*p
1de00 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74  Mem2);"..*/.stat
1de10 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61  ic int vdbeCompa
1de20 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63  reMemString(.  c
1de30 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1de40 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1de50 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  em2,.  const Col
1de60 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75  lSeq *pColl,.  u
1de70 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20  8 *prcErr       
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de90 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  * If an OOM occu
1dea0 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54  rs, set to SQLIT
1deb0 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20  E_NOMEM */.){.  
1dec0 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
1ded0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
1dee0 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
1def0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
1df00 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
1df10 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
1df20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
1df30 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
1df40 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
1df50 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
1df60 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
1df70 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
1df80 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
1df90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1dfa0 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
1dfb0 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
1dfc0 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
1dfd0 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69  Mem c2;.    sqli
1dfe0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1dff0 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c1, pMem1->db, M
1e000 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1e010 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1e020 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c2, pMem1->db,
1e030 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1e040 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1e050 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
1e060 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
1e070 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e080 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1e090 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
1e0a0 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
1e0b0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1e0c0 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1e0d0 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
1e0e0 63 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c  c);.    v2 = sql
1e0f0 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1e100 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1e110 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  2, pColl->enc);.
1e120 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1e130 7c 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20  | v2==0) ){.    
1e140 20 20 69 66 28 20 70 72 63 45 72 72 20 29 20 2a    if( prcErr ) *
1e150 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f  prcErr = SQLITE_
1e160 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
1e170 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
1e180 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1e190 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1e1a0 6c 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20  l->pUser, c1.n, 
1e1b0 76 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20  v1, c2.n, v2);. 
1e1c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e1d0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1e1e0 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
1e1f0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1e200 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  c2);.    return 
1e210 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
1e220 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62   The input pBlob
1e230 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1e240 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74  o be a Blob that
1e250 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a   is not marked.*
1e260 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e  * with MEM_Zero.
1e270 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
1e280 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a   it could be a z
1e290 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  ero-blob..*/.sta
1e2a0 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72  tic int isAllZer
1e2b0 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  o(const char *z,
1e2c0 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
1e2d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1e2e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e2f0 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  z[i] ) return 0;
1e300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1e310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1e320 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65  e two blobs.  Re
1e330 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1e340 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1e350 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   if the first.**
1e360 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1e370 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1e380 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1e390 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ond, respectivel
1e3a0 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f  y..** If one blo
1e3b0 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  b is a prefix of
1e3c0 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e   the other, then
1e3d0 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20   the shorter is 
1e3e0 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53  the lessor..*/.S
1e3f0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
1e400 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
1e410 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1e420 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
1e430 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  *pB2){.  int c;.
1e440 20 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e    int n1 = pB1->
1e450 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42  n;.  int n2 = pB
1e460 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  2->n;..  /* It i
1e470 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61  s possible to ha
1e480 76 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20  ve a Blob value 
1e490 74 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f  that has some no
1e4a0 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20  n-zero content. 
1e4b0 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1e4c0 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42  zero content.  B
1e4d0 75 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d  ut that only com
1e4e0 65 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20  es up for Blobs 
1e4f0 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74  formed.  ** by t
1e500 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1e510 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63   opcode, and suc
1e520 68 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65  h Blobs never ge
1e530 74 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  t passed into.  
1e540 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  ** sqlite3MemCom
1e550 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73  pare(). */.  ass
1e560 65 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73  ert( (pB1->flags
1e570 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1e580 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73  || n1==0 );.  as
1e590 73 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67  sert( (pB2->flag
1e5a0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1e5b0 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20   || n2==0 );..  
1e5c0 69 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c  if( (pB1->flags|
1e5d0 70 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45  pB2->flags) & ME
1e5e0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66  M_Zero ){.    if
1e5f0 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70  ( pB1->flags & p
1e600 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B2->flags & MEM_
1e610 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65  Zero ){.      re
1e620 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72  turn pB1->u.nZer
1e630 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f  o - pB2->u.nZero
1e640 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e650 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB1->flags & MEM
1e660 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69  _Zero ){.      i
1e670 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42  f( !isAllZero(pB
1e680 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20  2->z, pB2->n) ) 
1e690 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1e6a0 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e   return pB1->u.n
1e6b0 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d  Zero - n2;.    }
1e6c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1e6d0 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e  !isAllZero(pB1->
1e6e0 7a 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74  z, pB1->n) ) ret
1e6f0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1e700 74 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75  turn n1 - pB2->u
1e710 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20  .nZero;.    }.  
1e720 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  }.  c = memcmp(p
1e730 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e  B1->z, pB2->z, n
1e740 31 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b  1>n2 ? n2 : n1);
1e750 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72  .  if( c ) retur
1e760 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31  n c;.  return n1
1e770 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - n2;.}../*.** 
1e780 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  Do a comparison 
1e790 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74  between a 64-bit
1e7a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1e7b0 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  and a 64-bit flo
1e7c0 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e  ating-point.** n
1e7d0 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e  umber.  Return n
1e7e0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1e7f0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1e800 65 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73  e first (i64) is
1e810 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65   less than,.** e
1e820 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1e830 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1e840 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f  ond (double)..*/
1e850 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
1e860 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1e870 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65  re(i64 i, double
1e880 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f   r){.  if( sizeo
1e890 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50  f(LONGDOUBLE_TYP
1e8a0 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47  E)>8 ){.    LONG
1e8b0 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20  DOUBLE_TYPE x = 
1e8c0 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1e8d0 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20  )i;.    if( x<r 
1e8e0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1e8f0 20 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72   if( x>r ) retur
1e900 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1e910 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1e920 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62   i64 y;.    doub
1e930 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c  le s;.    if( r<
1e940 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
1e950 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20  5808.0 ) return 
1e960 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39  +1;.    if( r>=9
1e970 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1e980 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  08.0 ) return -1
1e990 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72  ;.    y = (i64)r
1e9a0 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20  ;.    if( i<y ) 
1e9b0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1e9c0 66 28 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20  f( i>y ) return 
1e9d0 2b 31 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75  +1;.    s = (dou
1e9e0 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73  ble)i;.    if( s
1e9f0 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1ea00 20 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65      if( s>r ) re
1ea10 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1ea20 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
1ea30 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
1ea40 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64  values contained
1ea50 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f   by the two memo
1ea60 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e  ry cells, return
1ea70 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c  ing.** negative,
1ea80 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76   zero or positiv
1ea90 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65  e if pMem1 is le
1eaa0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1eab0 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a  o, or greater.**
1eac0 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72   than pMem2. Sor
1ead0 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55  ting order is NU
1eae0 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c  LL's first, foll
1eaf0 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20  owed by numbers 
1eb00 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64  (integers.** and
1eb10 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e   reals) sorted n
1eb20 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c  umerically, foll
1eb30 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64  owed by text ord
1eb40 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c  ered by the coll
1eb50 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1eb60 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61  e pColl and fina
1eb70 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72  lly blob's order
1eb80 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a  ed by memcmp()..
1eb90 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76  **.** Two NULL v
1eba0 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1ebb0 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68  ered equal by th
1ebc0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
1ebd0 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  int sqlite3MemCo
1ebe0 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1ebf0 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65  *pMem1, const Me
1ec00 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20  m *pMem2, const 
1ec10 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
1ec20 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20  .  int f1, f2;. 
1ec30 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   int combined_fl
1ec40 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65  ags;..  f1 = pMe
1ec50 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20  m1->flags;.  f2 
1ec60 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a  = pMem2->flags;.
1ec70 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73    combined_flags
1ec80 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65   = f1|f2;.  asse
1ec90 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c  rt( (combined_fl
1eca0 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
1ecb0 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49  )==0 );. .  /* I
1ecc0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e  f one value is N
1ecd0 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20  ULL, it is less 
1ece0 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20  than the other. 
1ecf0 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  If both values. 
1ed00 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65   ** are NULL, re
1ed10 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
1ed20 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1ed30 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
1ed40 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d    return (f2&MEM
1ed50 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d  _Null) - (f1&MEM
1ed60 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _Null);.  }..  /
1ed70 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  * At least one o
1ed80 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  f the two values
1ed90 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a   is a number.  *
1eda0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1edb0 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c  _flags&(MEM_Int|
1edc0 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20  MEM_Real) ){.   
1edd0 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1ede0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1edf0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1ee00 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i < pMem2->u.i
1ee10 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1ee20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1ee30 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i > pMem2->u.i 
1ee40 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1ee50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ee60 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26   }.    if( (f1 &
1ee70 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21   f2 & MEM_Real)!
1ee80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1ee90 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65  pMem1->u.r < pMe
1eea0 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
1eeb0 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1eec0 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d  Mem1->u.r > pMem
1eed0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1eee0 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1eef0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1ef00 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f1&MEM_Int)!=
1ef10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1ef20 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f2&MEM_Real)!=0 
1ef30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ef40 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  n sqlite3IntFloa
1ef50 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e  tCompare(pMem1->
1ef60 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29  u.i, pMem2->u.r)
1ef70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ef80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
1ef90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1efa0 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1efb0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1efc0 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e    if( (f2&MEM_In
1efd0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
1efe0 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33   return -sqlite3
1eff0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1f000 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem2->u.i, pMem
1f010 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  1->u.r);.      }
1f020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1f030 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1f040 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1f050 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n +1;.  }..  /* 
1f060 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1f070 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
1f080 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
1f090 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
1f0a0 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1f0b0 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
1f0c0 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
1f0d0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
1f0e0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1f0f0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1f100 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
1f110 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
1f120 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1f130 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1f140 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
1f150 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1f160 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1f170 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1f180 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
1f190 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d  2->enc || pMem1-
1f1a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1f1b0 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
1f1c0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1f1d0 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20  ITE_UTF8 || .   
1f1e0 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e           pMem1->
1f1f0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1f200 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e  6LE || pMem1->en
1f210 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
1f220 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  E );..    /* The
1f230 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1f240 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69  nce must be defi
1f250 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ned at this poin
1f260 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a  t, even if.    *
1f270 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74  * the user delet
1f280 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
1f290 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
1f2a0 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
1f2b0 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69   is.    ** compi
1f2c0 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f  led (this was no
1f2d0 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  t always the cas
1f2e0 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  e)..    */.    a
1f2f0 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c  ssert( !pColl ||
1f300 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a   pColl->xCmp );.
1f310 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1f320 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
1f330 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1f340 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  ing(pMem1, pMem2
1f350 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , pColl, 0);.   
1f360 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e   }.    /* If a N
1f370 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20  ULL pointer was 
1f380 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
1f390 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  llate function, 
1f3a0 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20  fall through.   
1f3b0 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20   ** to the blob 
1f3c0 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d  case and use mem
1f3d0 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20  cmp().  */.  }. 
1f3e0 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65  .  /* Both value
1f3f0 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e  s must be blobs.
1f400 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20    Compare using 
1f410 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
1f420 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c  return sqlite3Bl
1f430 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c  obCompare(pMem1,
1f440 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   pMem2);.}.../*.
1f450 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
1f460 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
1f470 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f480 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74   a serial-type t
1f490 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  hat.** correspon
1f4a0 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ds to an integer
1f4b0 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65   - all values be
1f4c0 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e  tween 1 and 9 in
1f4d0 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65  clusive .** exce
1f4e0 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64  pt 7. The second
1f4f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
1f500 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
1f510 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a  n integer value.
1f520 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63  ** serialized ac
1f530 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61  cording to seria
1f540 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e  l_type. This fun
1f550 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1f560 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  es.** and return
1f570 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a  s the value..*/.
1f580 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52  static i64 vdbeR
1f590 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75  ecordDecodeInt(u
1f5a0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1f5b0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b  const u8 *aKey){
1f5c0 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65  .  u32 y;.  asse
1f5d0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
1f5e0 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  | (serial_type>=
1f5f0 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  1 && serial_type
1f600 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=9 && serial_ty
1f610 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74  pe!=7) );.  swit
1f620 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1f630 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20  ){.    case 0:. 
1f640 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20     case 1:.     
1f650 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1f660 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1f670 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45   return ONE_BYTE
1f680 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1f690 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65  case 2:.      te
1f6a0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1f6b0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1f6c0 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e  turn TWO_BYTE_IN
1f6d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1f6e0 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 3:.      testc
1f6f0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1f700 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1f710 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  n THREE_BYTE_INT
1f720 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1f730 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   4: {.      test
1f740 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1f750 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20  80 );.      y = 
1f760 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1f770 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Key);.      retu
1f780 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26  rn (i64)*(int*)&
1f790 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  y;.    }.    cas
1f7a0 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 5: {.      tes
1f7b0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1f7c0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1f7d0 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  urn FOUR_BYTE_UI
1f7e0 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
1f7f0 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1f800 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f810 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1f820 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20  : {.      u64 x 
1f830 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1f840 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f850 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1f860 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20  0x80 );.      x 
1f870 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1f880 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1f890 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  4);.      return
1f8a0 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b   (i64)*(i64*)&x;
1f8b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1f8c0 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
1f8d0 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e - 8);.}../*.**
1f8e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1f8f0 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
1f900 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
1f910 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
1f920 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
1f930 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
1f940 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
1f950 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
1f960 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
1f970 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
1f980 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
1f990 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
1f9a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
1f9b0 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
1f9c0 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
1f9d0 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
1f9e0 65 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  eated by the OP_
1f9f0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1fa00 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
1fa10 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
1fa20 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
1fa30 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
1fa40 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1fa50 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
1fa60 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  Record..**.** If
1fa70 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20   argument bSkip 
1fa80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  is non-zero, it 
1fa90 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1faa0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1fab0 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d  lready.** determ
1fac0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1fad0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1fae0 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1faf0 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
1fb00 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
1fb10 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
1fb20 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
1fb30 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a  fields. If all .
1fb40 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ** fields that a
1fb50 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65  ppear in both ke
1fb60 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68  ys are equal, th
1fb70 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  en pPKey2->defau
1fb80 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74  lt_rc is .** ret
1fb90 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1fba0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1fbb0 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65  ion is discovere
1fbc0 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65  d, set pPKey2->e
1fbd0 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51  rrCode to .** SQ
1fbe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
1fbf0 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e   return 0. If an
1fc00 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
1fc10 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70  countered, .** p
1fc20 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69  PKey2->errCode i
1fc30 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
1fc40 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74  NOMEM and, if it
1fc50 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1fc60 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c  e.** malloc-fail
1fc70 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64  ed flag set on d
1fc80 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
1fc90 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1fca0 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ->db)..*/.int sq
1fcb0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1fcc0 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a  ompareWithSkip(.
1fcd0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1fce0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1fcf0 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
1fd00 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1fd10 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20  d *pPKey2,      
1fd20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1fd30 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20  */.  int bSkip  
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
1fd60 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20   skip the first 
1fd70 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33  field */.){.  u3
1fd80 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fda0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1fdb0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1fdc0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
1fdd0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fdf0 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66   Index of next f
1fe00 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  ield to compare 
1fe10 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1fe40 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e  record header in
1fe50 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1fe60 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20  idx1;           
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1fe80 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
1fe90 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  ype in header */
1fea0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1fed0 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68  ue */.  Mem *pRh
1fee0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  s = pPKey2->aMem
1fef0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
1ff00 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1ff10 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1ff20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1ff30 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1ff40 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1ff50 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1ff60 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1ff70 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1ff80 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1ff90 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1ffa0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1ffb0 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1ffc0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1ffd0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1ffe0 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1fff0 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
20000 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
20010 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
20020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
20030 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
20040 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
20050 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
20060 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
20070 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
20080 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
20090 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
200a0 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
200b0 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
200c0 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
200d0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
200e0 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
200f0 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
20100 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
20110 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
20120 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
20130 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
20140 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
20150 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
20160 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
20170 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
20180 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
20190 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
201a0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
201b0 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
201c0 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
201d0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
201e0 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
201f0 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
20200 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
20210 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
20220 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
20230 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
20240 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  ld .       || CO
20250 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
20260 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
20270 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
20280 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
20290 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
202a0 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30  nfo->nKeyField>0
202b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
202c0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
202d0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
202e0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
202f0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
20300 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
20310 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
20320 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
20330 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
20340 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
20350 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
20360 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
20370 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
20380 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
20390 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  10 ){.        rc
203a0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
203b0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
203c0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
203d0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
203e0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
203f0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
20400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
20410 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
20420 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
20430 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
20440 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49    rc = -sqlite3I
20450 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
20460 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75  Rhs->u.i, mem1.u
20470 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
20480 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
20490 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
204a0 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
204b0 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
204c0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
204d0 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
204e0 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
204f0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
20500 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
20510 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
20520 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
20530 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
20540 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20550 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
20560 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
20570 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
20580 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
20590 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
205a0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
205b0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
205c0 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
205d0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
205e0 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74  ypes 12 or great
205f0 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61  er are strings a
20600 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65  nd blobs (greate
20610 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a  r than.        *
20620 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65  * numbers). Type
20630 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20  s 10 and 11 are 
20640 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72  currently "reser
20650 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a  ved for future .
20660 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c          ** use",
20670 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72   so it doesn't r
20680 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61  eally matter wha
20690 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
206a0 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20   comparing.     
206b0 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75     ** them to nu
206c0 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72  mberic values ar
206d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
206e0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
206f0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
20700 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
20710 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
20720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20730 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
20740 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
20750 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
20760 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
20770 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
20780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
20790 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d  ( mem1.u.r<pRhs-
207a0 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
207b0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
207c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
207d0 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e   mem1.u.r>pRhs->
207e0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
207f0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
20800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74   rc = sqlite3Int
20830 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d  FloatCompare(mem
20840 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72  1.u.i, pRhs->u.r
20850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20860 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20870 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
20880 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
20890 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
208a0 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
208b0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
208c0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
208d0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
208e0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
208f0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
20900 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
20910 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
20920 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
20930 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
20940 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
20950 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20960 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
20970 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
20980 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
20990 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
209a0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
209b0 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
209c0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
209d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
209e0 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
209f0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
20a00 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
20a10 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
20a20 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
20a30 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
20a40 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
20a50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20a60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
20a70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
20a80 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
20a90 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
20aa0 6c 73 65 20 69 66 28 20 28 70 4b 65 79 49 6e 66  lse if( (pKeyInf
20ab0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
20ac0 49 6e 66 6f 29 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  Info)->aColl[i] 
20ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
20ae0 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
20af0 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  ->enc;.         
20b00 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
20b10 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  nfo->db;.       
20b20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20     mem1.flags = 
20b30 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20  MEM_Str;.       
20b40 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61     mem1.z = (cha
20b50 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20  r*)&aKey1[d1];. 
20b60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
20b70 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
20b80 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng(.            
20b90 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70    &mem1, pRhs, p
20ba0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
20bb0 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43  ], &pPKey2->errC
20bc0 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ode.          );
20bd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20be0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
20bf0 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c  mp = MIN(mem1.n,
20c00 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
20c10 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
20c20 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
20c30 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
20c40 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
20c50 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d   ) rc = mem1.n -
20c60 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20   pRhs->n; .     
20c70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20c80 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
20c90 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20  s a blob */.    
20ca0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
20cb0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
20cc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20cd0 20 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20   (pRhs->flags & 
20ce0 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
20cf0 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  pRhs->n==0 );.  
20d00 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
20d10 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
20d20 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
20d30 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
20d40 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
20d50 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
20d60 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
20d70 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
20d80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20d90 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
20da0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
20db0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
20dc0 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
20dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
20de0 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
20df0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
20e00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
20e10 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
20e20 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
20e30 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
20e40 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
20e50 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
20e60 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
20e70 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
20e80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20e90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
20ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20eb0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
20ec0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
20ed0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
20ee0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
20ef0 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41          if( !isA
20f00 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68  llZero((const ch
20f10 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e  ar*)&aKey1[d1],n
20f20 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Str) ){.        
20f30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
20f40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20f50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53           rc = nS
20f60 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65  tr - pRhs->u.nZe
20f70 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ro;.          }.
20f80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20f90 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
20fa0 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52  p = MIN(nStr, pR
20fb0 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
20fc0 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
20fd0 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
20fe0 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
20ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
21000 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
21010 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ->n;.        }. 
21020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
21030 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c    /* RHS is null
21040 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   */.    else{.  
21050 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
21060 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
21070 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61       rc = (seria
21080 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20  l_type!=0);.    
21090 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  }..    if( rc!=0
210a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
210b0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
210c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
210d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
210e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
210f0 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
21100 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
21110 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
21120 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20  Key2, rc) );.   
21130 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
21140 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
21150 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
21160 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
21170 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
21180 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28      i++;.    if(
21190 20 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65   i==pPKey2->nFie
211a0 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ld ) break;.    
211b0 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b  pRhs++;.    d1 +
211c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
211d0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
211e0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78  l_type);.    idx
211f0 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69  1 += sqlite3Vari
21200 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  ntLen(serial_typ
21210 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  e);.  }while( id
21220 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48  x1<(unsigned)szH
21230 64 72 31 20 26 26 20 64 31 3c 3d 28 75 6e 73 69  dr1 && d1<=(unsi
21240 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20  gned)nKey1 );.. 
21250 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
21260 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
21270 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
21280 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
21290 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
212a0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
212b0 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
212c0 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
212d0 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
212e0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
212f0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
21300 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
21310 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73  mem1).  */.  ass
21320 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
21330 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
21340 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
21350 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68  that one or both
21360 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
21370 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
21380 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
21390 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
213a0 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
213b0 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
213c0 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
213d0 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alue.  */.  asse
213e0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a  rt( CORRUPT_DB .
213f0 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65         || vdbeRe
21400 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
21410 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21420 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64  PKey2, pPKey2->d
21430 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20  efault_rc) .    
21440 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b     || pPKey2->pK
21450 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
21460 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
21470 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
21480 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   1;.  return pPK
21490 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
214a0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
214b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
214c0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
214d0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
214e0 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
214f0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21500 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
21510 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
21520 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
21530 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
21540 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
21550 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21560 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  PKey2, 0);.}.../
21570 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21580 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
21590 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
215a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
215b0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
215c0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
215d0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
215e0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  is an integer, a
215f0 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73  nd (b) the .** s
21600 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
21610 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  rint at the star
21620 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
21630 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
21640 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65  gle.** byte (i.e
21650 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  . is less than 1
21660 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  28)..**.** To av
21670 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f  oid concerns abo
21680 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ut buffer overre
21690 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ads, this routin
216a0 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a  e is only used.*
216b0 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65  * on schemas whe
216c0 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  re the maximum v
216d0 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65  alid header size
216e0 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20   is 63 bytes or 
216f0 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
21700 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
21710 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20  mpareInt(.  int 
21720 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
21730 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
21740 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
21750 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
21760 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
21770 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
21780 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
21790 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
217a0 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
217b0 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
217c0 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
217d0 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
217e0 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
217f0 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
21800 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20  64 x;.  i64 v;. 
21810 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62   i64 lhs;..  vdb
21820 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
21830 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
21840 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21850 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
21860 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29   assert( (*(u8*)
21870 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20  pKey1)<=0x3F || 
21880 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
21890 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
218a0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
218b0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
218c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
218d0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45  .      lhs = ONE
218e0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
218f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21900 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
21910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21920 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
21930 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
21940 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
21950 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
21960 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
21970 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
21980 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21990 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
219a0 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
219b0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
219c0 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42     lhs = THREE_B
219d0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
219e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
219f0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
21a00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
21a10 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
21a20 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
21a30 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
21a40 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
21a50 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
21a60 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
21a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21a80 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
21a90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21aa0 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
21ab0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
21ac0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
21ad0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
21ae0 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
21af0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
21b00 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
21b10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
21b20 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
21b30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
21b40 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79  ase 6: { /* 8-by
21b50 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
21b60 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46  r */.      x = F
21b70 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
21b80 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  ey);.      x = (
21b90 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
21ba0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
21bb0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69  .      lhs = *(i
21bc0 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65  64*)&x;.      te
21bd0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
21be0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21bf0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
21c00 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a  .      lhs = 0;.
21c10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21c20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c   case 9:.      l
21c30 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  hs = 1;.      br
21c40 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  eak;..    /* Thi
21c50 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20  s case could be 
21c60 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20  removed without 
21c70 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73  changing the res
21c80 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a  ults of running.
21c90 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
21ca0 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63  . Including it c
21cb0 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e  auses gcc to gen
21cc0 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73  erate a faster s
21cd0 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74  witch .    ** st
21ce0 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74  atement (since t
21cf0 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74  he range of swit
21d00 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73  ch targets now s
21d10 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e  tarts at zero an
21d20 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74  d.    ** is cont
21d30 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73  iguous) but does
21d40 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64   not cause any d
21d50 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f  uplicate code to
21d60 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20   be generated.  
21d70 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20    ** (as gcc is 
21d80 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f  clever enough to
21d90 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f   combine the two
21da0 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74   like cases). Ot
21db0 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  her .    ** comp
21dc0 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73  ilers might be s
21dd0 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20  imilar.  */ .   
21de0 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a   case 0: case 7:
21df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
21e00 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21e10 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
21e20 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20  ey1, pPKey2);.. 
21e30 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
21e40 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21e50 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21e60 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
21e70 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20  pPKey2);.  }..  
21e80 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  v = pPKey2->aMem
21e90 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76  [0].u.i;.  if( v
21ea0 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
21eb0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
21ec0 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
21ed0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
21ee0 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
21ef0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
21f00 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
21f10 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
21f20 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
21f30 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
21f40 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
21f50 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
21f60 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
21f70 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21f80 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
21f90 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
21fa0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Key2, 1);.  }els
21fb0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e{.    /* The fi
21fc0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
21fd0 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
21fe0 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61  qual and there a
21ff0 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20  re no trailing. 
22000 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65     ** fields. Re
22010 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
22020 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20  ault_rc in this 
22030 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73  case. */.    res
22040 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
22050 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79  lt_rc;.    pPKey
22060 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
22070 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
22080 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
22090 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
220a0 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
220b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
220c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
220d0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
220e0 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
220f0 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
22100 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
22110 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
22120 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
22130 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
22140 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
22150 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
22160 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
22170 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
22180 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
22190 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
221a0 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
221b0 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
221c0 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
221d0 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
221e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
221f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22200 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
22210 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
22220 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
22230 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
22240 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
22250 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
22260 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
22270 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
22280 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
22290 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
222a0 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
222b0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
222c0 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26  >aMem[0].flags &
222d0 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64   MEM_Str );.  vd
222e0 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
222f0 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
22300 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22310 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
22320 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
22330 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
22340 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
22350 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
22360 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
22370 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
22380 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
22390 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
223a0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
223b0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
223c0 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
223d0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
223e0 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
223f0 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
22400 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
22410 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
22420 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
22430 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
22440 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
22450 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
22460 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
22470 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
22480 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
22490 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
224a0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
224b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
224c0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
224d0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
224e0 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
224f0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
22500 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
22510 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
22520 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
22530 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
22540 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
22550 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
22560 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
22570 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
22580 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
22590 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
225a0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
225b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
225c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
225d0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
225e0 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
225f0 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
22600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22610 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
22620 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
22630 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
22640 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
22650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22660 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
22670 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
22680 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
22690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
226a0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
226b0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
226c0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
226d0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
226e0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
226f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
22700 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
22710 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
22720 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
22730 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
22740 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
22750 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
22760 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
22770 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
22780 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
22790 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
227a0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
227b0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
227c0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
227d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
227e0 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
227f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
22800 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
22810 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
22820 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
22830 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
22840 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
22850 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
22860 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
22870 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
22880 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
22890 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
228a0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
228b0 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
228c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
228d0 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
228e0 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
228f0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
22900 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
22910 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
22920 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
22930 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
22940 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
22950 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
22960 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
22970 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
22980 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
22990 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
229a0 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
229b0 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
229c0 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
229d0 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
229e0 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
229f0 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
22a00 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
22a10 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
22a20 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
22a30 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
22a40 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
22a50 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
22a60 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
22a70 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
22a80 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
22a90 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
22aa0 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
22ab0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
22ac0 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
22ad0 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
22ae0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
22af0 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
22b00 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
22b10 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
22b20 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
22b30 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
22b40 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
22b50 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
22b60 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
22b70 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
22b80 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
22b90 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
22ba0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
22bb0 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
22bc0 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
22bd0 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
22be0 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20  ->nAllField<=13 
22bf0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
22c00 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c   = p->aMem[0].fl
22c10 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ags;.    if( p->
22c20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
22c30 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rder[0] ){.     
22c40 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20   p->r1 = 1;.    
22c50 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20    p->r2 = -1;.  
22c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22c70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ->r1 = -1;.     
22c80 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20   p->r2 = 1;.    
22c90 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
22ca0 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20   & MEM_Int) ){. 
22cb0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
22cc0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
22cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
22ce0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
22cf0 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65  M_Real );.    te
22d00 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
22d10 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  MEM_Null );.    
22d20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
22d30 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
22d40 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
22d50 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c  MEM_Real|MEM_Nul
22d60 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  l|MEM_Blob))==0 
22d70 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  && p->pKeyInfo->
22d80 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20  aColl[0]==0 ){. 
22d90 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
22da0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
22db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
22dc0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
22dd0 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ring;.    }.  }.
22de0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
22df0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22e00 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  re;.}../*.** pCu
22e10 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
22e20 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
22e30 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
22e40 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
22e50 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
22e60 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
22e70 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
22e80 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
22e90 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
22ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22eb0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
22ec0 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
22ed0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
22ee0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
22ef0 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
22f00 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
22f10 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
22f20 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
22f30 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
22f40 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
22f50 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
22f60 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
22f70 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
22f80 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
22f90 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
22fa0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
22fb0 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
22fc0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
22fd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
22fe0 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
22ff0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
23000 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
23010 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
23020 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
23030 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
23040 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
23050 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
23060 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
23070 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
23080 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
23090 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
230a0 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
230b0 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
230c0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
230d0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
230e0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
230f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
23100 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
23110 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
23120 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
23130 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
23140 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
23150 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
23160 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
23170 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
23180 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
23190 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
231a0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
231b0 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c  (pCur) );.  nCel
231c0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  lKey = sqlite3Bt
231d0 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
231e0 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Cur);.  assert( 
231f0 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
23200 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
23210 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
23220 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
23230 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
23240 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
23250 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
23260 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
23270 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
23280 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
23290 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
232a0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26  (u32)nCellKey, &
232b0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
232c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
232d0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
232e0 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
232f0 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
23300 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
23310 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
23320 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
23330 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
23340 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
23350 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
23360 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
23370 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
23380 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
23390 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
233a0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
233b0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
233c0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
233d0 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
233e0 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
233f0 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
23400 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
23410 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
23420 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
23430 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
23440 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
23450 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
23460 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
23470 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
23480 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
23490 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
234a0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
234b0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
234c0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
234d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
234e0 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
234f0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
23500 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
23510 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
23520 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
23530 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
23540 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
23550 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
23560 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
23570 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
23580 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
23590 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
235a0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
235b0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
235c0 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64  eSizes[typeRowid
235d0 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ];.  testcase( (
235e0 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
235f0 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
23600 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
23610 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
23620 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
23630 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
23640 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
23650 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
23660 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
23670 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
23680 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
23690 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
236a0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
236b0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
236c0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
236d0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
236e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
236f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23700 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
23710 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
23720 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
23730 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
23740 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
23750 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
23760 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
23770 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
23780 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
23790 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
237a0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
237b0 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
237c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
237d0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
237e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
237f0 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
23800 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
23810 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
23820 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
23830 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
23840 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
23850 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
23860 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
23870 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
23880 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
23890 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
238a0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
238b0 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
238c0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
238d0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
238e0 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
238f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
23900 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
23910 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
23920 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
23930 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
23940 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
23950 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
23960 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
23970 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
23980 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
23990 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
239a0 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
239b0 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
239c0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
239d0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
239e0 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
239f0 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
23a00 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
23a10 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
23a20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23a30 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
23a40 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
23a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23a60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
23a70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
23a80 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
23a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23aa0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
23ab0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
23ac0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
23ad0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
23ae0 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
23af0 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
23b00 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
23b10 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
23b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
23b30 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
23b40 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
23b50 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
23b60 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
23b70 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
23b80 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  Cur;.  Mem m;.. 
23b90 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
23ba0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
23bb0 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d  TREE );.  pCur =
23bc0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
23bd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23be0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
23bf0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
23c00 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  nCellKey = sqlit
23c10 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
23c20 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e  ze(pCur);.  /* n
23c30 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
23c40 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
23c50 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
23c60 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
23c70 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
23c80 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
23c90 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
23ca0 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
23cb0 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
23cc0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
23cd0 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
23ce0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
23cf0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
23d00 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23d10 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
23d20 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
23d30 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
23d40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
23d50 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
23d60 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
23d70 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  y, &m);.  if( rc
23d80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
23d90 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
23da0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
23db0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
23dc0 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
23dd0 63 6b 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cked, 0);.  sqli
23de0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23df0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
23e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23e10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23e20 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
23e30 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
23e40 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
23e50 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
23e60 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
23e70 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
23e80 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
23e90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
23ea0 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
23eb0 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
23ec0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
23ed0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
23ee0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
23ef0 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
23f00 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
23f10 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
23f20 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
23f30 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
23f40 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
23f50 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
23f60 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
23f70 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
23f80 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
23f90 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
23fa0 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
23fb0 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
23fc0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
23fd0 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
23fe0 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
23ff0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
24000 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
24010 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
24020 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
24030 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
24040 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
24050 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
24060 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
24070 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
24080 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
24090 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
240a0 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
240b0 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
240c0 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
240d0 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
240e0 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
240f0 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
24100 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
24110 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
24120 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
24130 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
24140 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
24150 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
24160 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
24170 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
24180 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
24190 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
241a0 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
241b0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
241c0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
241d0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
241e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
241f0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
24200 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
24210 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
24220 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
24230 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
24240 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
24250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24260 74 68 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41  the SQLITE_PREPA
24270 52 45 20 66 6c 61 67 73 20 66 6f 72 20 61 20 56  RE flags for a V
24280 64 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  dbe..*/.u8 sqlit
24290 65 33 56 64 62 65 50 72 65 70 61 72 65 46 6c 61  e3VdbePrepareFla
242a0 67 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  gs(Vdbe *v){.  r
242b0 65 74 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61  eturn v->prepFla
242c0 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
242d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
242e0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
242f0 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
24300 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
24310 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
24320 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
24330 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
24340 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
24350 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
24360 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
24370 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
24380 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
24390 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
243a0 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
243b0 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
243c0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
243d0 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
243e0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
243f0 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
24400 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
24410 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
24420 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
24430 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
24440 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
24450 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
24460 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
24470 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
24480 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
24490 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
244a0 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
244b0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ];.    assert( (
244c0 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  v->db->flags & S
244d0 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
244e0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
244f0 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
24500 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
24510 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
24520 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
24530 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
24540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
24550 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
24560 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
24570 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
24580 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
24590 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
245a0 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
245b0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
245c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
245d0 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
245e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
245f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
24600 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
24610 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
24620 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
24630 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
24640 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
24650 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
24660 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
24670 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
24680 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
24690 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
246a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
246b0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
246c0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
246d0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
246e0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
246f0 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (v->db->flags & 
24700 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
24710 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  G)==0 );.  if( i
24720 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76  Var>=32 ){.    v
24730 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38  ->expmask |= 0x8
24740 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65  0000000;.  }else
24750 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
24760 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
24770 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
24780 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 20 66  ./*.** Cause a f
24790 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77  unction to throw
247a0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20   an error if it 
247b0 77 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50  was call from OP
247c0 5f 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74  _PureFunc.** rat
247d0 68 65 72 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63  her than OP_Func
247e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50  tion..**.** OP_P
247f0 75 72 65 46 75 6e 63 20 6d 65 61 6e 73 20 74 68  ureFunc means th
24800 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
24810 6d 75 73 74 20 62 65 20 64 65 74 65 72 6d 69 6e  must be determin
24820 69 73 74 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c  istic, and shoul
24830 64 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65 72  d.** throw an er
24840 72 6f 72 20 69 66 20 69 74 20 69 73 20 67 69 76  ror if it is giv
24850 65 6e 20 69 6e 70 75 74 73 20 74 68 61 74 20 77  en inputs that w
24860 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e  ould make it non
24870 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a  -deterministic..
24880 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24890 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 64 61  is invoked by da
248a0 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e  te/time function
248b0 73 20 74 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64  s that use non-d
248c0 65 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20  eterministic.** 
248d0 66 65 61 74 75 72 65 73 20 73 75 63 68 20 61 73  features such as
248e0 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73   'now'..*/.int s
248f0 71 6c 69 74 65 33 4e 6f 74 50 75 72 65 46 75 6e  qlite3NotPureFun
24900 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
24910 74 20 2a 70 43 74 78 29 7b 0a 23 69 66 64 65 66  t *pCtx){.#ifdef
24920 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
24930 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
24940 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d  if( pCtx->pVdbe=
24950 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23  =0 ) return 1;.#
24960 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74 78  endif.  if( pCtx
24970 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74  ->pVdbe->aOp[pCt
24980 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d  x->iOp].opcode==
24990 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 20  OP_PureFunc ){. 
249a0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
249b0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
249c0 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72        "non-deter
249d0 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
249e0 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65  n in index expre
249f0 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63  ssion or CHECK c
24a00 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20 20 20  onstraint",.    
24a10 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75     -1);.    retu
24a20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
24a30 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 1;.}..#ifndef
24a40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
24a50 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
24a60 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
24a70 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
24a80 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
24a90 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
24aa0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
24ab0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
24ac0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
24ad0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
24ae0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
24af0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
24b00 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
24b10 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
24b20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
24b30 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
24b40 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
24b50 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
24b60 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
24b70 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
24b80 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
24b90 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24ba0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
24bb0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
24bc0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
24bd0 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
24be0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
24bf0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
24c00 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
24c10 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
24c20 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
24c30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
24c40 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
24c50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
24c60 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
24c70 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
24c80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
24c90 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
24ca0 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
24cb0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
24cc0 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
24cd0 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
24ce0 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
24cf0 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
24d00 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
24d10 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
24d20 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
24d30 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
24d40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24d50 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
24d60 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
24d70 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
24d80 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
24d90 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
24da0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
24db0 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
24dc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
24dd0 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
24de0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
24df0 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52  Field, UnpackedR
24e00 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
24e10 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
24e20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24e30 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
24e40 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
24e50 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
24e60 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
24e70 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
24e80 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
24e90 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
24ea0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
24eb0 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , p);.  }.}.#end
24ec0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
24ed0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
24ee0 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OK */..#ifdef SQ
24ef0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
24f00 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a  PDATE_HOOK./*.**
24f10 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
24f20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20  update hook. If 
24f30 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
24f40 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d  E or DELETE pre-
24f50 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20  update call,.** 
24f60 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73  then cursor pass
24f70 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24f80 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
24f90 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
24fa0 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65  w about.** to be
24fb0 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
24fc0 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69  ed. If the appli
24fd0 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  cation calls sql
24fe0 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f  ite3_preupdate_o
24ff0 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71  ld(),.** the req
25000 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c  uired value will
25010 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
25020 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
25030 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76   points to..*/.v
25040 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
25050 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20  reUpdateHook(.  
25060 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61  /* Vdbe pre-upda
25090 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te hook is invok
250a0 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43  ed by */.  VdbeC
250b0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
250c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
250d0 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64  rsor to grab old
250e0 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a  .* values from *
250f0 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
25120 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
25130 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73  DELETE */.  cons
25140 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
25150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25160 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
25170 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61    /* Modified ta
251a0 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  ble */.  i64 iKe
251b0 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y1,             
251c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
251d0 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f  ial key value */
251e0 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
25210 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20  or new.* record 
25220 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
25230 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69  *db = v->db;.  i
25240 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55  64 iKey2;.  PreU
25250 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b  pdate preupdate;
25260 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25270 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tbl = pTab->zNam
25280 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  e;.  static cons
25290 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64  t u8 fakeSortOrd
252a0 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  er = 0;..  asser
252b0 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
252c0 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e==0 );.  memset
252d0 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20  (&preupdate, 0, 
252e0 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65  sizeof(PreUpdate
252f0 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77  ));.  if( HasRow
25300 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20  id(pTab)==0 ){. 
25310 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32     iKey1 = iKey2
25320 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64   = 0;.    preupd
25330 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65  ate.pPk = sqlite
25340 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
25350 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
25360 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
25370 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  ITE_UPDATE ){.  
25380 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
25390 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
253a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
253b0 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey2 = iKey1;. 
253c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
253d0 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64  rt( pCsr->nField
253e0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20  ==pTab->nCol .  
253f0 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e       || (pCsr->n
25400 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f  Field==pTab->nCo
25410 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54  l+1 && op==SQLIT
25420 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67  E_DELETE && iReg
25430 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72  ==-1).  );..  pr
25440 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20  eupdate.v = v;. 
25450 20 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20   preupdate.pCsr 
25460 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64  = pCsr;.  preupd
25470 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ate.op = op;.  p
25480 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67  reupdate.iNewReg
25490 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70   = iReg;.  preup
254a0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20  date.keyinfo.db 
254b0 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74  = db;.  preupdat
254c0 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20  e.keyinfo.enc = 
254d0 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70  ENC(db);.  preup
254e0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
254f0 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  yField = pTab->n
25500 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
25510 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
25520 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  der = (u8*)&fake
25530 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
25540 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
25550 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
25560 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
25570 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
25580 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
25590 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
255a0 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
255b0 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
255c0 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
255d0 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
255e0 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
255f0 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
25600 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
25610 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25620 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
25630 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
25640 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
25650 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
25660 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75  KeyField+1, preu
25670 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
25680 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
25690 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
256a0 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46  te.keyinfo.nKeyF
256b0 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74  ield+1, preupdat
256c0 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b  e.pNewUnpacked);
256d0 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65  .  if( preupdate
256e0 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  .aNew ){.    int
256f0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
25700 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b   i<pCsr->nField;
25710 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
25720 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
25730 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e  se(&preupdate.aN
25740 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
25750 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
25760 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  N(db, preupdate.
25770 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
25780 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
25790 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
257a0 4f 4f 4b 20 2a 2f 0a                             OOK */.