/ Hex Artifact Content
Login

Artifact b00d35805a2b326d1371ab7ce8f3a95c8af35b1431367ffe482fc2c735d69fb1:


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 4e 65 78 74 49 66 4f   case OP_NextIfO
50e0: 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 63 61 73  pen:.        cas
50f0: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
5100: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
5110: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
5120: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
5130: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
5140: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
5150: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
5160: 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
5170: 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65  rator never code
5180: 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f  s any of these o
5190: 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70  pcodes as a jump
51a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
51b0: 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20   a label.  They 
51c0: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64  are always coded
51d0: 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77   as a jump backw
51e0: 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20  ards to a .     
51f0: 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64       ** known ad
5200: 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  dress */.       
5210: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
5220: 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  p2>=0 );.       
5230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5240: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5250: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
5260: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
5270: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
5280: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
5290: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
52a0: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20  ePrevious;.     
52b0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
52c0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
52d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
52e0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e  code generator n
52f0: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f  ever codes any o
5300: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  f these opcodes 
5310: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20  as a jump.      
5320: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65      ** to a labe
5330: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  l.  They are alw
5340: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a  ays coded as a j
5350: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f  ump backwards to
5360: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   a .          **
5370: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a   known address *
5380: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
5390: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
53a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
53b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
53c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
53d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
53e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
53f0: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
5400: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
5410: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
5420: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
5430: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5450: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
5460: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
5470: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  t n;.          a
5480: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d  ssert( (pOp - p-
5490: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20  >aOp) >= 3 );.  
54a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
54b0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
54c0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
54d0: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b          n = pOp[
54e0: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20  -1].p1;.        
54f0: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
5500: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
5510: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61  .          /* Fa
5520: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
5530: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65  the default case
5540: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23 65   */.        }.#e
5550: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66  ndif.        def
5560: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
5570: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20    if( pOp->p2<0 
5580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
5590: 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  * The mkopcodeh.
55a0: 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73  tcl script has s
55b0: 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67  o arranged thing
55c0: 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a  s that the only.
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
55e0: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
55f0: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
5600: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
5610: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
5620: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
5630: 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  ave non-negative
5640: 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20   values for P2. 
5650: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
5660: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f  ssert( (sqlite3O
5670: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
5680: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
5690: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20  LG_JUMP)!=0 );. 
56a0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
56b0: 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  t( ADDR(pOp->p2)
56c0: 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20  <pParse->nLabel 
56d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
56e0: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
56f0: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a  ADDR(pOp->p2)];.
5700: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5710: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5730: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70       /* The mkop
5740: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74  codeh.tcl script
5750: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64   has so arranged
5760: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65   things that the
5770: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e   only.      ** n
5780: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
5790: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
57a0: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
57b0: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
57c0: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f        ** have no
57d0: 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  n-negative value
57e0: 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20  s for P2. */.   
57f0: 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69     assert( (sqli
5800: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
5810: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f  y[pOp->opcode]&O
5820: 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c  PFLG_JUMP)==0 ||
5830: 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20   pOp->p2>=0);.  
5840: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d    }.    if( pOp=
5850: 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b  =p->aOp ) break;
5860: 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a  .    pOp--;.  }.
5870: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5880: 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  p->db, pParse->a
5890: 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65  Label);.  pParse
58a0: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->aLabel = 0;.  
58b0: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d  pParse->nLabel =
58c0: 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41   0;.  *pMaxFuncA
58d0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
58e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
58f0: 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d  Reader!=0 || DbM
5900: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
5910: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f  reeMask) );.}../
5920: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5930: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
5940: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
5950: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
5960: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5970: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
5980: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
5990: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
59a0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
59b0: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
59c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  }../*.** Verify 
59d0: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20  that at least N 
59e0: 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65  opcode slots are
59f0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20   available in p 
5a00: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
5a10: 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20  g to malloc for 
5a20: 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65  more space (exce
5a30: 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  pt when compiled
5a40: 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
5a50: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
5a60: 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74  RESS).  This int
5a70: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64  erface is used d
5a80: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a  uring testing.**
5a90: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
5aa0: 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f  certain calls to
5ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ac0: 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65  pList() can neve
5ad0: 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f  r.** fail due to
5ae0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64   a OOM fault and
5af0: 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20   hence that the 
5b00: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
5b10: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
5b20: 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c  AddOpList() will
5b30: 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e   always be non-N
5b40: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ULL..*/.#if defi
5b50: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5b60: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
5b70: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
5b80: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73  C_STRESS).void s
5b90: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
5ba0: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
5bb0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29  (Vdbe *p, int N)
5bc0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
5bd0: 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61  Op + N <= p->pPa
5be0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b  rse->nOpAlloc );
5bf0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5c00: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
5c10: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68   VM passed as th
5c20: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
5c30: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5c40: 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74  .** an OP_Result
5c50: 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c  Row opcode. Fail
5c60: 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20   an assert() if 
5c70: 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73  it does. This is
5c80: 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65   used.** by code
5c90: 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20   in pragma.c to 
5ca0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
5cb0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
5cc0: 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61  f certain.** pra
5cd0: 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69  gmas comports wi
5ce0: 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65  th the flags spe
5cf0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b  cified in the mk
5d00: 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a  pragmatab.tcl.**
5d10: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20   script..*/.#if 
5d20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5d30: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
5d40: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
5d50: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
5d60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
5d70: 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28  rifyNoResultRow(
5d80: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
5d90: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5da0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
5db0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5dc0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52  [i].opcode!=OP_R
5dd0: 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a  esultRow );.  }.
5de0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5df0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 61  Generate code (a
5e00: 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72 74   single OP_Abort
5e10: 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68 61  able opcode) tha
5e20: 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66 79  t will.** verify
5e30: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 70   that the VDBE p
5e40: 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65 6c  rogram can safel
5e50: 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e 20  y call Abort in 
5e60: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
5e70: 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20 64  ontext..*/.#if d
5e80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
5e90: 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  BUG).void sqlite
5ea0: 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74  3VdbeVerifyAbort
5eb0: 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  able(Vdbe *p, in
5ec0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69 66  t onError){.  if
5ed0: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
5ee0: 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  ort ) sqlite3Vdb
5ef0: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41 62  eAddOp0(p, OP_Ab
5f00: 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ortable);.}.#end
5f10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
5f20: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5f30: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5f40: 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65   array of opcode
5f50: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
5f60: 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61  h.** the Vdbe pa
5f70: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5f80: 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69  t argument. It i
5f90: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
5fa0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
5fb0: 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74  to arrange for t
5fc0: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61  he returned arra
5fd0: 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c  y to be eventual
5fe0: 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74  ly freed using t
5ff0: 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f  he .** vdbeFreeO
6000: 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f  pArray() functio
6010: 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  n..**.** Before 
6020: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70  returning, *pnOp
6030: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6040: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
6050: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
6060: 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c  .** array. Also,
6070: 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65   *pnMaxArg is se
6080: 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20  t to the larger 
6090: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
60a0: 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65  alue and .** the
60b0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
60c0: 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  es in the Vdbe.a
60d0: 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71  pArg[] array req
60e0: 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65  uired to execute
60f0: 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   the .** returne
6100: 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64  d program..*/.Vd
6110: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
6120: 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62  eTakeOpArray(Vdb
6130: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c  e *p, int *pnOp,
6140: 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b   int *pnMaxArg){
6150: 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d  .  VdbeOp *aOp =
6160: 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72   p->aOp;.  asser
6170: 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62  t( aOp && !p->db
6180: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6190: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
61a0: 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  at sqlite3VdbeUs
61b0: 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f  esBtree() was no
61c0: 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  t called on this
61d0: 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   VM */.  assert(
61e0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
61f0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
6200: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
6210: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
6220: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
6230: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
6240: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
6250: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
6260: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
6270: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
6280: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
6290: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
62a0: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
62b0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72   operation inser
62c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a  ted..**.** Non-z
62d0: 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73  ero P2 arguments
62e0: 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   to jump instruc
62f0: 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61  tions are automa
6300: 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64  tically adjusted
6310: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
6320: 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72  jump target is r
6330: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66  elative to the f
6340: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  irst operation i
6350: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65  nserted..*/.Vdbe
6360: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  Op *sqlite3VdbeA
6370: 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65  ddOpList(.  Vdbe
6380: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
6390: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
63a0: 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70  opcodes to the p
63b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
63c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20  t */.  int nOp, 
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
63f0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20   opcodes to add 
6400: 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20  */.  VdbeOpList 
6410: 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20  const *aOp,     
6420: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73    /* The opcodes
6430: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
6440: 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20    int iLineno   
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6460: 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69  * Source-file li
6470: 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72  ne number of fir
6480: 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a  st opcode */.){.
6490: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
64a0: 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74  p *pOut, *pFirst
64b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e  ;.  assert( nOp>
64c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
64d0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
64e0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
64f0: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
6500: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
6510: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
6520: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
6530: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6540: 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74  .  pFirst = pOut
6550: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
6560: 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p];.  for(i=0; i
6570: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b  <nOp; i++, aOp++
6580: 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70  , pOut++){.    p
6590: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f  Out->opcode = aO
65a0: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70  p->opcode;.    p
65b0: 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70  Out->p1 = aOp->p
65c0: 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20  1;.    pOut->p2 
65d0: 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61  = aOp->p2;.    a
65e0: 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d  ssert( aOp->p2>=
65f0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71  0 );.    if( (sq
6600: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
6610: 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[aOp->opcode]
6620: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
6630: 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29  0 && aOp->p2>0 )
6640: 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  {.      pOut->p2
6650: 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   += p->nOp;.    
6660: 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d  }.    pOut->p3 =
6670: 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f   aOp->p3;.    pO
6680: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
6690: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75  NOTUSED;.    pOu
66a0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
66b0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
66c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
66d0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
66e0: 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a  ENTS.    pOut->z
66f0: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
6700: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
6710: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
6720: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69      pOut->iSrcLi
6730: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a  ne = iLineno+i;.
6740: 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29  #else.    (void)
6750: 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a  iLineno;.#endif.
6760: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
6770: 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  BUG.    if( p->d
6780: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6790: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
67a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
67b0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
67c0: 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f  i+p->nOp, &p->aO
67d0: 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20  p[i+p->nOp]);.  
67e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
67f0: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
6800: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
6810: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
6820: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
6830: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
6840: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
6850: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
6860: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
6870: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
6880: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
6890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
68a0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
68b0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
68e0: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
68f0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
6900: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
6910: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
6920: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
6930: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
6940: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
6950: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
6960: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
6970: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
6980: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
6990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
69a0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
69b0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
69c0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
69f0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
6a00: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
6a10: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
6a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
6a30: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
6a40: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
6a50: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
6a60: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
6a70: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
6a80: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
6a90: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
6aa0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
6ab0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
6ac0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
6ad0: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
6ae0: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
6af0: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
6b00: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
6b10: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
6b20: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
6b30: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
6b40: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
6b50: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
6b60: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
6b70: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
6b80: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
6b90: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
6ba0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
6bb0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
6bc0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
6bd0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
6be0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
6bf0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
6c00: 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50  the opcode, or P
6c10: 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35  1, P2, P3, or P5
6c20: 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72   operands.** for
6c30: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
6c40: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6c50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6c60: 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  geOpcode(Vdbe *p
6c70: 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20 69  , u32 addr, u8 i
6c80: 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71  NewOpcode){.  sq
6c90: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
6ca0: 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d  ,addr)->opcode =
6cb0: 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76   iNewOpcode;.}.v
6cc0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
6cd0: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
6ce0: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
6cf0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
6d00: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
6d10: 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p1 = val;.}.voi
6d20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6d30: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75  ngeP2(Vdbe *p, u
6d40: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
6d50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6d60: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
6d70: 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  2 = val;.}.void 
6d80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6d90: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP3(Vdbe *p, u32
6da0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
6db0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
6dc0: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20  tOp(p,addr)->p3 
6dd0: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
6de0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6df0: 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20 70  5(Vdbe *p, u16 p
6e00: 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  5){.  assert( p-
6e10: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d  >nOp>0 || p->db-
6e20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6e30: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20  .  if( p->nOp>0 
6e40: 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  ) p->aOp[p->nOp-
6e50: 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f  1].p5 = p5;.}../
6e60: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
6e70: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
6e80: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
6e90: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
6ea0: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
6eb0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
6ec0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
6ed0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
6ee0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6ef0: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
6f00: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
6f10: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
6f20: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
6f30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
6f40: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
6f50: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
6f60: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
6f70: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
6f80: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
6f90: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
6fa0: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
6fb0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
6fc0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
6fd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
6fe0: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
6ff0: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
7000: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
7010: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
7020: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
7030: 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d  N(db, pDef);.  }
7040: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7050: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
7060: 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c  sqlite3 *, Op *,
7070: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65   int);../*.** De
7080: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20  lete a P4 value 
7090: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
70a0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
70b0: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65  OINLINE void fre
70c0: 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a  eP4Mem(sqlite3 *
70d0: 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69  db, Mem *p){.  i
70e0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
70f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7100: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7110: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
7120: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74  N(db, p);.}.stat
7130: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
7140: 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46 75  NE void freeP4Fu
7150: 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a 64  ncCtx(sqlite3 *d
7160: 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  b, sqlite3_conte
7170: 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45 70  xt *p){.  freeEp
7180: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7190: 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a 20  db, p->pFunc);. 
71a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
71b0: 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63  db, p);.}.static
71c0: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
71d0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
71e0: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
71f0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b  .  assert( db );
7200: 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70  .  switch( p4typ
7210: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
7220: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
7230: 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28    freeP4FuncCtx(
7240: 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  db, (sqlite3_con
7250: 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20 20  text*)p4);.     
7260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7270: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
7280: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
7290: 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44  4:.    case P4_D
72a0: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73 65  YNAMIC:.    case
72b0: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
72c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
72d0: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
72e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
72f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7300: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7310: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
7320: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
7330: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
7340: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
7350: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
7360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7370: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
7380: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7390: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f  NTS.    case P4_
73a0: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  EXPR: {.      sq
73b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
73c0: 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a  db, (Expr*)p4);.
73d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
73e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
73f0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
7400: 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d  .      freeEphem
7410: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c  eralFunction(db,
7420: 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a   (FuncDef*)p4);.
7430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7440: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
7450: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EM: {.      if( 
7460: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
7470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
7480: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
7490: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
74a0: 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p4);.      }else
74b0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34  {.        freeP4
74c0: 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34  Mem(db, (Mem*)p4
74d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
74e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
74f0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
7500: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d   {.      if( db-
7510: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
7520: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
7530: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
7540: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
7550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7560: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
7570: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
7580: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
7590: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
75a0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
75b0: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
75c0: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
75d0: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
75e0: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
75f0: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
7600: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
7610: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
7620: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
7630: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
7640: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
7650: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
7660: 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f   for(pOp=&aOp[nO
7670: 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20  p-1]; pOp>=aOp; 
7680: 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pOp--){.      if
7690: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d  ( pOp->p4type <=
76a0: 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29   P4_FREE_IF_LE )
76b0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
76c0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
76d0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
76e0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
76f0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
7700: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7710: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
7720: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
7730: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7740: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70  DbFreeNN(db, aOp
7750: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7760: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
7770: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
7780: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
7790: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
77a0: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
77b0: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
77c0: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
77d0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
77e0: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
77f0: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
7800: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
7810: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
7820: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7830: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
7840: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
7850: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
7860: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
7870: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
7880: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
7890: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
78a0: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
78b0: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
78c0: 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  oop.*/.int sqlit
78d0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
78e0: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
78f0: 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20  addr){.  VdbeOp 
7900: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64  *pOp;.  if( p->d
7910: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7920: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
7930: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26  sert( addr>=0 &&
7940: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
7950: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
7960: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
7970: 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  p->db, pOp->p4ty
7980: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
7990: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
79a0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f  P4_NOTUSED;.  pO
79b0: 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70  p->p4.z = 0;.  p
79c0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
79d0: 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31  Noop;.  return 1
79e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
79f0: 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73  e last opcode is
7a00: 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20   "op" and it is 
7a10: 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69  not a jump desti
7a20: 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20  nation,.** then 
7a30: 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75  remove it.  Retu
7a40: 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f  rn true if and o
7a50: 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65  nly if an opcode
7a60: 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f   was removed..*/
7a70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
7a80: 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64  DeletePriorOpcod
7a90: 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70  e(Vdbe *p, u8 op
7aa0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  ){.  if( p->nOp>
7ab0: 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 && p->aOp[p->n
7ac0: 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op-1].opcode==op
7ad0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
7ae0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7af0: 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70  ToNoop(p, p->nOp
7b00: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
7b10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
7b30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7b40: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
7b50: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
7b60: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
7b70: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
7b80: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
7b90: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
7ba0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
7bb0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
7bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
7bd0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
7be0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
7bf0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
7c00: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
7c10: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
7c20: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
7c30: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
7c40: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
7c50: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
7c60: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
7c70: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
7c80: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
7c90: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
7ca0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
7cb0: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
7cc0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
7cd0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
7ce0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
7cf0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
7d00: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
7d10: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
7d20: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
7d30: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
7d40: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
7d50: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
7d60: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
7d70: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7d80: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
7d90: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
7da0: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
7db0: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
7dc0: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
7dd0: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
7de0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
7df0: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
7e00: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
7e10: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
7e20: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
7e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
7e40: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64  LITE_NOINLINE vd
7e50: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a  beChangeP4Full(.
7e60: 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20    Vdbe *p,.  Op 
7e70: 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *pOp,.  const ch
7e80: 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e  ar *zP4,.  int n
7e90: 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  .){.  if( pOp->p
7ea0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65  4type ){.    fre
7eb0: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
7ec0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
7ed0: 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  p);.    pOp->p4t
7ee0: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  ype = 0;.    pOp
7ef0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a  ->p4.p = 0;.  }.
7f00: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
7f10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7f20: 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f  geP4(p, (int)(pO
7f30: 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34  p - p->aOp), zP4
7f40: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
7f50: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
7f60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7f70: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
7f80: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
7f90: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
7fa0: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
7fb0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
7fc0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  NAMIC;.  }.}.voi
7fd0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
7fe0: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
7ff0: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
8000: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
8010: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
8020: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
8030: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
8040: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
8050: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
8060: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
8070: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8080: 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  aOp!=0 || db->ma
8090: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
80a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
80b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20  iled ){.    if( 
80c0: 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65  n!=P4_VTAB ) fre
80d0: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
80e0: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
80f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8100: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
8110: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
8120: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
8130: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
8140: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
8150: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
8160: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
8170: 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c  ];.  if( n>=0 ||
8180: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
8190: 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34      vdbeChangeP4
81a0: 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34  Full(p, pOp, zP4
81b0: 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , n);.    return
81c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50  ;.  }.  if( n==P
81d0: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
81e0: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
81f0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
8200: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
8210: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
8220: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
8230: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
8240: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
8250: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
8260: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
8270: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
8280: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
8290: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
82a0: 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61   zP4!=0 ){.    a
82b0: 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20  ssert( n<0 );.  
82c0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
82d0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
82e0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
82f0: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20  ned char)n;.    
8300: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
8310: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
8320: 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a  ((VTable*)zP4);.
8330: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
8340: 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72 61  nge the P4 opera
8350: 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nd of the most r
8360: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
8370: 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f  struction .** to
8380: 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69 6e   the value defin
8390: 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d 65  ed by the argume
83a0: 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61 20  nts.  This is a 
83b0: 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65  high-speed.** ve
83c0: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
83d0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e 0a  VdbeChangeP4()..
83e0: 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 65  **.** The P4 ope
83f0: 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 61  rand must not ha
8400: 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ve been previous
8410: 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e 64  ly defined.  And
8420: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d   the new.** P4 m
8430: 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e  ust not be P4_IN
8440: 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74 65  T32.  Use sqlite
8450: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20  3VdbeChangeP4() 
8460: 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  in either of.** 
8470: 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a  those cases..*/.
8480: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8490: 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a 70  AppendP4(Vdbe *p
84a0: 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74  , void *pP4, int
84b0: 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70   n){.  VdbeOp *p
84c0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 21  Op;.  assert( n!
84d0: 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d  =P4_INT32 && n!=
84e0: 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73  P4_VTAB );.  ass
84f0: 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69  ert( n<=0 );.  i
8500: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
8510: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 72  Failed ){.    fr
8520: 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70  eeP4(p->db, n, p
8530: 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  P4);.  }else{.  
8540: 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d 30    assert( pP4!=0
8550: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8560: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
8570: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  pOp = &p->aOp[p-
8580: 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73  >nOp-1];.    ass
8590: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
85a0: 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a  ==P4_NOTUSED );.
85b0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
85c0: 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = n;.    pOp->p4
85d0: 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a  .p = pP4;.  }.}.
85e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
85f0: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
8600: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63  cently added opc
8610: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  ode to the KeyIn
8620: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  fo for the.** in
8630: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  dex given..*/.vo
8640: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
8650: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  tP4KeyInfo(Parse
8660: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
8670: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a  *pIdx){.  Vdbe *
8680: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8690: 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  e;.  KeyInfo *pK
86a0: 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74  eyInfo;.  assert
86b0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
86c0: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
86d0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
86e0: 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
86f0: 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  x(pParse, pIdx);
8700: 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20  .  if( pKeyInfo 
8710: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70  ) sqlite3VdbeApp
8720: 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66  endP4(v, pKeyInf
8730: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
8740: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8750: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
8760: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43  COMMENTS./*.** C
8770: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
8780: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
8790: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
87a0: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
87b0: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
87c0: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
87d0: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
87e0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
87f0: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
8800: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
8810: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
8820: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
8830: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
8840: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
8850: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
8860: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e  void vdbeVCommen
8870: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
8880: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
8890: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61  va_list ap){.  a
88a0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
88b0: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
88c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
88d0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
88e0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
88f0: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
8900: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8910: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
8920: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
8930: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
8940: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
8950: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
8960: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e  omment);.    p->
8970: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
8980: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
8990: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
89a0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
89b0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
89c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
89d0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
89e0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
89f0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
8a00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f  if( p ){.    va_
8a10: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8a20: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
8a30: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
8a40: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
8a50: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
8a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
8a70: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
8a80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
8a90: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
8aa0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
8ab0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
8ac0: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50  VdbeAddOp0(p, OP
8ad0: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73  _Noop);.    va_s
8ae0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
8af0: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
8b00: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
8b10: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
8b20: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
8b30: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
8b40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
8b50: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a  DBE_COVERAGE./*.
8b60: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
8b70: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65   if the iSrcLine
8b80: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70   field for the p
8b90: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20  reviously coded 
8ba0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
8bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8bc0: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64  SetLineNumber(Vd
8bd0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65  be *v, int iLine
8be0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
8bf0: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72  GetOp(v,-1)->iSr
8c00: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d  cLine = iLine;.}
8c10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8c20: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20  E_VDBE_COVERAGE 
8c30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
8c40: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
8c50: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
8c60: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
8c70: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
8c80: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
8c90: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
8ca0: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
8cb0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8cc0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
8cd0: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
8ce0: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
8cf0: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
8d00: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
8d10: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
8d20: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
8d30: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
8d40: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
8d50: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
8d60: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
8d70: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
8d80: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
8d90: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
8da0: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
8db0: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
8dc0: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
8dd0: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f  ng.** after an O
8de0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
8df0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
8e00: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
8e10: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
8e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
8e30: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
8e40: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
8e50: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
8e60: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
8e70: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
8e80: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
8e90: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
8ea0: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
8eb0: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
8ec0: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
8ed0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
8ee0: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
8ef0: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
8f00: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
8f10: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
8f20: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
8f30: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
8f40: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
8f50: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
8f60: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
8f70: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
8f80: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
8f90: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
8fa0: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
8fb0: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
8fc0: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
8fd0: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
8fe0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
8ff0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
9000: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
9010: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
9020: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
9030: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
9040: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
9050: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
9060: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
9070: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9080: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
9090: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
90a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
90b0: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
90c0: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
90d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
90e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
90f0: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
9100: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
9110: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
9120: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
9130: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
9140: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
9150: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
9160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
9170: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
9180: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
9190: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
91a0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
91b0: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
91c0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
91d0: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
91e0: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
91f0: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
9200: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
9210: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
9220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
9230: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
9240: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
9250: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
9260: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
9270: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
9280: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
9290: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
92a0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
92b0: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
92c0: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
92d0: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
92e0: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
92f0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
9300: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
9310: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
9320: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
9330: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
9340: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
9350: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
9360: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
9370: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
9380: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
9390: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
93a0: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
93b0: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
93c0: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
93d0: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
93e0: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
93f0: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
9400: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
9410: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
9420: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
9430: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
9440: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
9450: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
9460: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
9470: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
9480: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
9490: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
94a0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
94b0: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
94c0: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
94d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
94e0: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
94f0: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
9500: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
9510: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
9520: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
9530: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
9540: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
9550: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9560: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
9570: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
9580: 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41  i, jj;.  char zA
9590: 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d  lt[50];.  zOpNam
95a0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
95b0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
95c0: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
95d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
95e0: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
95f0: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
9600: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
9610: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
9620: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
9630: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
9640: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
9650: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
9660: 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33  Synopsis,"IF ",3
9670: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
9680: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
9690: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20  TE_STOREP2 ){.  
96a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
96b0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
96c0: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32  lt), zAlt, "r[P2
96d0: 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f  ] = (%s)", zSyno
96e0: 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d  psis+3);.      }
96f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9710: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
9720: 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50  t, "if %s goto P
9730: 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29  2", zSynopsis+3)
9740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9750: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74  zSynopsis = zAlt
9760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
9770: 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d  ii=jj=0; jj<nTem
9780: 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e  p-1 && (c = zSyn
9790: 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69  opsis[ii])!=0; i
97a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
97b0: 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20  c=='P' ){.      
97c0: 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b    c = zSynopsis[
97d0: 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  ++ii];.        i
97e0: 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20  f( c=='4' ){.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9800: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
9810: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
9820: 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20  , zP4);.        
9830: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27  }else if( c=='X'
9840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9850: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9860: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
9870: 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  j, "%s", pOp->zC
9880: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  omment);.       
9890: 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a     seenCom = 1;.
98a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
98b0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20           int v1 
98c0: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20  = translateP(c, 
98d0: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
98e0: 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20  int v2;.        
98f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9900: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
9910: 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29  mp+jj, "%d", v1)
9920: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9930: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
9940: 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29  s+ii+1, "@P", 2)
9950: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9960: 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20     ii += 3;.    
9970: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
9980: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
9990: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20  emp+jj);.       
99a0: 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c       v2 = transl
99b0: 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69  ateP(zSynopsis[i
99c0: 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  i], pOp);.      
99d0: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
99e0: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
99f0: 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"+1",2)==0 ){. 
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20               ii 
9a10: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
9a20: 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20      v2++;.      
9a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9a40: 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a      if( v2>1 ){.
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
9a60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9a70: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
9a80: 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32  j, "..%d", v1+v2
9a90: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1);.           
9aa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
9ab0: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
9ac0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
9ad0: 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20  ..P3", 4)==0 && 
9ae0: 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20  pOp->p3==0 ){.  
9af0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
9b00: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
9b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9b20: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
9b30: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
9b40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9b50: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b         zTemp[jj+
9b60: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
9b70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
9b80: 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65  eenCom && jj<nTe
9b90: 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f  mp-5 && pOp->zCo
9ba0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  mment ){.      s
9bb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9bc0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9bd0: 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d  jj, "; %s", pOp-
9be0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
9bf0: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
9c00: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
9c10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9c20: 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d   jj<nTemp ) zTem
9c30: 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  p[jj] = 0;.  }el
9c40: 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d  se if( pOp->zCom
9c50: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
9c60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9c70: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c  mp, zTemp, "%s",
9c80: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
9c90: 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65  .    jj = sqlite
9ca0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29  3Strlen30(zTemp)
9cb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9cc0: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
9cd0: 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   jj = 0;.  }.  r
9ce0: 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64  eturn jj;.}.#end
9cf0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
9d00: 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f  UG */..#if VDBE_
9d10: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65  DISPLAY_P4 && de
9d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9d30: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
9d40: 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  )./*.** Translat
9d50: 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76  e the P4.pExpr v
9d60: 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43  alue for an OP_C
9d70: 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65  ursorHint opcode
9d80: 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68   into text.** th
9d90: 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61  at can be displa
9da0: 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f  yed in the P4 co
9db0: 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20  lumn of EXPLAIN 
9dc0: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  output..*/.stati
9dd0: 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34  c void displayP4
9de0: 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70  Expr(StrAccum *p
9df0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9e00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9e10: 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28  p = 0;.  switch(
9e20: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
9e30: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
9e40: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
9e50: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
9e60: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
9e70: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
9e80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e90: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73  INTEGER:.      s
9ea0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
9eb0: 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70  df(p, "%d", pExp
9ec0: 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20  r->u.iValue);.  
9ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9ee0: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
9ef0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
9f00: 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c 22  ppendf(p, "NULL"
9f10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9f20: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
9f30: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
9f40: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
9f50: 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45  f(p, "r[%d]", pE
9f60: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
9f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9f80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
9f90: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
9fa0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
9fb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
9fc0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
9fd0: 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  (p, "rowid");.  
9fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9ff0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a000: 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22 2c  ppendf(p, "c%d",
a010: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f   (int)pExpr->iCo
a020: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
a030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a040: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
a050: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54  :      zOp = "LT
a060: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a070: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
a080: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20      zOp = "LE"; 
a090: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a0a0: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
a0b0: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20   zOp = "GT";    
a0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a0d0: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f  e TK_GE:      zO
a0e0: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62  p = "GE";      b
a0f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a100: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_NE:      zOp =
a110: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61   "NE";      brea
a120: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
a130: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  Q:      zOp = "E
a140: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  Q";      break;.
a150: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
a160: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b       zOp = "IS";
a170: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a180: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
a190: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b    zOp = "ISNOT";
a1a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a1b0: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
a1c0: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20  Op = "AND";     
a1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a1e0: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20  TK_OR:      zOp 
a1f0: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65  = "OR";      bre
a200: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a210: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22  PLUS:    zOp = "
a220: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ADD";     break;
a230: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
a240: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c  R:    zOp = "MUL
a250: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a260: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
a270: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20     zOp = "SUB"; 
a280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a290: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
a2a0: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  zOp = "REM";    
a2b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a2c0: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70   TK_BITAND:  zOp
a2d0: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72   = "BITAND";  br
a2e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a2f0: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20  _BITOR:   zOp = 
a300: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b  "BITOR";   break
a310: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
a320: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49  ASH:   zOp = "DI
a330: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  V";     break;. 
a340: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
a350: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46  T:  zOp = "LSHIF
a360: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
a370: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
a380: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b   zOp = "RSHIFT";
a390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a3a0: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f  e TK_CONCAT:  zO
a3b0: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62  p = "CONCAT";  b
a3c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a3d0: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d  K_UMINUS:  zOp =
a3e0: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61   "MINUS";   brea
a3f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
a400: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50  PLUS:   zOp = "P
a410: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LUS";    break;.
a420: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
a430: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e  OT:  zOp = "BITN
a440: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
a450: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
a460: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20    zOp = "NOT";  
a470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a480: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
a490: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20  Op = "ISNULL";  
a4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a4b0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20  TK_NOTNULL: zOp 
a4c0: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
a4d0: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
a4e0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
a4f0: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
a500: 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20  %s", "expr");.  
a510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a520: 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20    if( zOp ){.   
a530: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a540: 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20 7a  endf(p, "%s(", z
a550: 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79  Op);.    display
a560: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
a570: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28  >pLeft);.    if(
a580: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
a590: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a5a0: 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 2c  str_append(p, ",
a5b0: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73  ", 1);.      dis
a5c0: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
a5d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
a5e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
a5f0: 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 29  str_append(p, ")
a600: 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", 1);.  }.}.#en
a610: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50  dif /* VDBE_DISP
a620: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65  LAY_P4 && define
a630: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
a640: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f  CURSOR_HINTS) */
a650: 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50  ...#if VDBE_DISP
a660: 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LAY_P4./*.** Com
a670: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
a680: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
a690: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
a6a0: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
a6b0: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
a6c0: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
a6d0: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
a6e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
a6f0: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
a700: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
a710: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
a720: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
a730: 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78  mp;.  StrAccum x
a740: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
a750: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74  p>=20 );.  sqlit
a760: 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
a770: 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65  x, 0, zTemp, nTe
a780: 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68  mp, 0);.  switch
a790: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
a7a0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
a7b0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
a7c0: 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  t j;.      KeyIn
a7d0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
a7e0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
a7f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a800: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
a810: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
a820: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a830: 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20  ndf(&x, "k(%d", 
a840: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
a850: 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  eld);.      for(
a860: 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d  j=0; j<pKeyInfo-
a870: 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29  >nKeyField; j++)
a880: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
a890: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
a8a0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
a8b0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
a8c0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
a8d0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
a8e0: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  : "";.        if
a8f0: 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20  ( strcmp(zColl, 
a900: 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a  "BINARY")==0 ) z
a910: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
a920: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a930: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 73  appendf(&x, ",%s
a940: 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
a950: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
a960: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22  SortOrder[j] ? "
a970: 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b  -" : "", zColl);
a980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a990: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a9a0: 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20  d(&x, ")", 1);. 
a9b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a9c0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
a9d0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
a9e0: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f  NTS.    case P4_
a9f0: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69  EXPR: {.      di
aa00: 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20  splayP4Expr(&x, 
aa10: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a  pOp->p4.pExpr);.
aa20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aa30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
aa40: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
aa50: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
aa60: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
aa70: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
aa80: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
aa90: 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20  (&x, "(%.20s)", 
aaa0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
aab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aac0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
aad0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
aae0: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
aaf0: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
ab00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ab10: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 28  appendf(&x, "%s(
ab20: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
ab30: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
ab40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ab50: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
ab60: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
ab70: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
ab80: 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50  FILE).    case P
ab90: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
aba0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
abb0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d   = pOp->p4.pCtx-
abc0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  >pFunc;.      sq
abd0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
abe0: 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20  f(&x, "%s(%d)", 
abf0: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
ac00: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
ac10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
ac20: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
ac30: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
ac40: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ac50: 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a  df(&x, "%lld", *
ac60: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20  pOp->p4.pI64);. 
ac70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac80: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
ac90: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T32: {.      sql
aca0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
acb0: 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  (&x, "%d", pOp->
acc0: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
acd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ace0: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
acf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ad00: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31  appendf(&x, "%.1
ad10: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
ad20: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
ad30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ad40: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
ad50: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
ad60: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
ad70: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
ad80: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
ad90: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
ada0: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
adb0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
adc0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
add0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
ade0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
adf0: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
ae00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ae10: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
ae20: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
ae30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
ae40: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
ae50: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
ae60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ae70: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
ae80: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
ae90: 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22      zP4 = "NULL"
aea0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aeb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
aec0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
aed0: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
aee0: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
aef0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
af00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
af10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
af20: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
af30: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
af40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
af50: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
af60: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
af70: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
af80: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
af90: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61   "vtab:%p", pVta
afa0: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
afb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
afc0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
afd0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AY: {.      int 
afe0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69  i;.      int *ai
aff0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
b000: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b       int n = ai[
b010: 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  0];   /* The fir
b020: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e  st element of an
b030: 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77   INTARRAY is alw
b040: 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ays the.        
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
b060: 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * count of the n
b070: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
b080: 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
b090: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
b0a0: 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =n; i++){.      
b0b0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b0c0: 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22 2c  pendf(&x, ",%d",
b0d0: 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d   ai[i]);.      }
b0e0: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
b0f0: 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c  = '[';.      sql
b100: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
b110: 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20  &x, "]", 1);.   
b120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b130: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
b140: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
b150: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b160: 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d  ndf(&x, "program
b170: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
b180: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b190: 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20  P4_DYNBLOB:.    
b1a0: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
b1b0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
b1c0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
b1d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b1e0: 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20  se P4_TABLE: {. 
b1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b200: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
b210: 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d  ", pOp->p4.pTab-
b220: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
b230: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b240: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b250: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
b260: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
b270: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
b280: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
b290: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
b2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b2b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
b2c0: 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a  ccumFinish(&x);.
b2d0: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
b2e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
b2f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44  ;.}.#endif /* VD
b300: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f  BE_DISPLAY_P4 */
b310: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
b320: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
b330: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
b340: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
b350: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
b360: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
b370: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
b380: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
b390: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
b3a0: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
b3b0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
b3c0: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
b3d0: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
b3e0: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
b3f0: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
b400: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
b410: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
b420: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
b430: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
b440: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
b450: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
b460: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
b470: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
b480: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
b490: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
b4a0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
b4b0: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
b4c0: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
b4d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
b4e0: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
b4f0: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
b500: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72  DbMaskSet(p->btr
b510: 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66  eeMask, i);.  if
b520: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
b530: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
b540: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
b550: 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  ) ){.    DbMaskS
b560: 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20  et(p->lockMask, 
b570: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  i);.  }.}..#if !
b580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b590: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
b5a0: 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  )./*.** If SQLit
b5b0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
b5c0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
b5d0: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
b5e0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
b5f0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
b600: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
b610: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
b620: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
b630: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
b640: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
b650: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
b660: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
b670: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
b680: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
b690: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
b6a0: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
b6b0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
b6c0: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
b6d0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
b6e0: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
b6f0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
b700: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
b710: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
b720: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
b730: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
b740: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
b750: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
b760: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
b770: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
b780: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
b790: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
b7a0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
b7b0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
b7c0: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
b7d0: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
b7e0: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
b7f0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
b800: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
b810: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
b820: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
b830: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
b840: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
b850: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
b860: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
b870: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
b880: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
b890: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
b8a0: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
b8b0: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
b8c0: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
b8d0: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
b8e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
b8f0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
b900: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
b910: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
b920: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
b930: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
b940: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
b950: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
b960: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
b970: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
b980: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
b990: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
b9a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b9b0: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
b9c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
b9d0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
b9e0: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
b9f0: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
ba00: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
ba10: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
ba20: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
ba30: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
ba40: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
ba50: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
ba60: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
ba70: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
ba80: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
ba90: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
baa0: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
bab0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
bac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bad0: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
bae0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
baf0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
bb00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bb10: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
bb20: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
bb30: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
bb40: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
bb50: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
bb60: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
bb70: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
bb80: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73  dbeEnter()..*/.s
bb90: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
bba0: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c  NLINE void vdbeL
bbb0: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
bbc0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
bbd0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
bbe0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64  ;.  int nDb;.  d
bbf0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
bc00: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
bc10: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
bc20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
bc30: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
bc40: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
bc50: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
bc60: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
bc70: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
bc80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
bc90: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  ve(aDb[i].pBt);.
bca0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
bcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
bcc0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
bcd0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
bce0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
bcf0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
bd00: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
bd10: 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a  vdbeLeave(p);.}.
bd20: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
bd30: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
bd40: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
bd50: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
bd60: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
bd70: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
bd80: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
bd90: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
bda0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bdb0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
bdc0: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
bdd0: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
bde0: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
bdf0: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
be00: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
be10: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
be20: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
be30: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
be40: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
be50: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
be60: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
be70: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
be80: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
be90: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
bea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
beb0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
bec0: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
bed0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
bee0: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
bef0: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
bf00: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
bf10: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
bf20: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
bf30: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
bf40: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
bf50: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
bf60: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
bf70: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
bf80: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
bf90: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
bfa0: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
bfb0: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
bfc0: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
bfd0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
bfe0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
bff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
c000: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
c010: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
c020: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
c030: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
c040: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
c050: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
c060: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c070: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72  nitialize an arr
c080: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
c090: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c0a0: 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  oid initMemArray
c0b0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20  (Mem *p, int N, 
c0c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36  sqlite3 *db, u16
c0d0: 20 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65   flags){.  while
c0e0: 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20  ( (N--)>0 ){.   
c0f0: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
c100: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67   p->flags = flag
c110: 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c  s;.    p->szMall
c120: 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  oc = 0;.#ifdef S
c130: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
c140: 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20  p->pScopyFrom = 
c150: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b  0;.#endif.    p+
c160: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
c170: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
c180: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
c190: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
c1a0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
c1b0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
c1c0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
c1d0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
c1e0: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
c1f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c200: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
c210: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
c220: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
c230: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
c240: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
c250: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
c260: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
c270: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
c280: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
c290: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
c2a0: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
c2b0: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
c2c0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
c2d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c2e0: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
c2f0: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
c300: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
c310: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
c320: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
c330: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
c340: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
c350: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
c360: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
c370: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
c380: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
c390: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
c3a0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
c3b0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
c3c0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
c3d0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
c3e0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
c3f0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
c400: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
c410: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
c420: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
c430: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
c440: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
c450: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
c460: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
c470: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
c480: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
c490: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
c4a0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
c4b0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
c4c0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
c4d0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
c4e0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
c4f0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
c500: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
c510: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
c520: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
c530: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
c540: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
c550: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
c560: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
c570: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
c580: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
c590: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
c5a0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
c5b0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
c5c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
c5d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
c5e0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
c5f0: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
c600: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
c610: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
c620: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c630: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
c640: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
c650: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
c660: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
c670: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
c680: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
c690: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
c6a0: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
c6b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c6c0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
c6d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
c6e0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
c6f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c700: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
c710: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
c720: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
c730: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
c740: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
c750: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
c760: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
c770: 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  End );.  }.}../*
c780: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
c790: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
c7a0: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
c7b0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
c7c0: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
c7d0: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
c7e0: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
c7f0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
c800: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c810: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
c820: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
c830: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
c840: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
c850: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
c860: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
c870: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
c880: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
c890: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
c8a0: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
c8b0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
c8c0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
c8d0: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
c8e0: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
c8f0: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
c900: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
c910: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
c920: 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26  Data(p->v->db, &
c930: 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
c940: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   0);.  sqlite3Db
c950: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
c960: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
c970: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c980: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
c990: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
c9a0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
c9b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
c9c0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
c9d0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
c9e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
c9f0: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
ca00: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
ca10: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
ca20: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
ca30: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
ca40: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
ca50: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
ca60: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
ca70: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
ca80: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
ca90: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
caa0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
cab0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
cac0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
cad0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
cae0: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
caf0: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
cb00: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
cb10: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
cb20: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
cb30: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
cb40: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
cb50: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30  UERY PLAN..** 20
cb60: 31 38 2d 30 34 2d 32 34 3a 20 20 49 6e 20 70 2d  18-04-24:  In p-
cb70: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65  >explain==2 mode
cb80: 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70  , the OP_Init op
cb90: 63 6f 64 65 73 20 6f 66 20 74 72 69 67 67 65 72  codes of trigger
cba0: 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 73 68  s.** are also sh
cbb0: 6f 77 6e 2c 20 73 6f 20 74 68 61 74 20 74 68 65  own, so that the
cbc0: 20 62 6f 75 6e 64 61 72 69 65 73 20 62 65 74 77   boundaries betw
cbd0: 65 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  een the main pro
cbe0: 67 72 61 6d 20 61 6e 64 0a 2a 2a 20 65 61 63 68  gram and.** each
cbf0: 20 74 72 69 67 67 65 72 20 61 72 65 20 63 6c 65   trigger are cle
cc00: 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  ar..**.** When p
cc10: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
cc20: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
cc30: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
cc40: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
cc50: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
cc60: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
cc70: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
cc80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
cc90: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
ccc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ccf0: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
cd00: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
cd10: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
cd20: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
cd30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cd40: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
cd50: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
cd60: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
cd70: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
cd80: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
cd90: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
cda0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
cdd0: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
cde0: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
cdf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ce00: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
ce10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
ce20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ce30: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ce60: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
ce70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ce80: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
ce90: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cea0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
ceb0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
cec0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
ced0: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
cee0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
cef0: 6e 74 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73  nt bListSubprogs
cf00: 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   = (p->explain==
cf10: 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20  1 || (db->flags 
cf20: 26 20 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72  & SQLITE_Trigger
cf30: 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f 70 20 2a  EQP)!=0);.  Op *
cf40: 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  pOp = 0;..  asse
cf50: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
cf60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
cf70: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
cf80: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
cf90: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
cfa0: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
cfb0: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
cfc0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
cfd0: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
cfe0: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
cff0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
d000: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
d010: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
d020: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
d030: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
d040: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
d050: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
d060: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
d070: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
d080: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
d090: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
d0a0: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
d0b0: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
d0c0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
d0d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
d0e0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
d0f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
d100: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
d110: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
d120: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
d130: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
d140: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
d150: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
d160: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71  iled.  */.    sq
d170: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
d180: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
d190: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
d1a0: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
d1b0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
d1c0: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
d1d0: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
d1e0: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
d1f0: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
d200: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
d210: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
d220: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
d230: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
d240: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d250: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
d260: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
d270: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
d280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
d290: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
d2a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
d2b0: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
d2c0: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
d2d0: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
d2e0: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
d2f0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
d300: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
d310: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
d320: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
d330: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
d340: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
d350: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 62 4c 69  ->nOp;.  if( bLi
d360: 73 74 53 75 62 70 72 6f 67 73 20 29 7b 0a 20 20  stSubprogs ){.  
d370: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
d380: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
d390: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
d3a0: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
d3b0: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
d3c0: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
d3d0: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
d3e0: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
d3f0: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
d400: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
d410: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
d420: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
d430: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
d440: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
d450: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
d460: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
d470: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
d480: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
d490: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
d4a0: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
d4b0: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
d4c0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
d4d0: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
d4e0: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
d4f0: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
d500: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
d510: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
d520: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
d530: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
d540: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
d550: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
d560: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
d570: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
d580: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
d590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
d5a0: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
d5b0: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
d5c0: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
d5d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69      }.  }..  whi
d5e0: 6c 65 28 31 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20  le(1){  /* Loop 
d5f0: 65 78 69 74 73 20 76 69 61 20 62 72 65 61 6b 20  exits via break 
d600: 2a 2f 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  */.    i = p->pc
d610: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  ++;.    if( i>=n
d620: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
d630: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d640: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d650: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 62 72  E_DONE;.      br
d660: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
d670: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
d680: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
d690: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
d6a0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
d6b0: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
d6c0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
d6d0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
d6e0: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
d6f0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
d700: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
d710: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
d720: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
d730: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
d740: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
d750: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
d760: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
d770: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
d780: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
d790: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
d7a0: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
d7b0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
d7c0: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
d7d0: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
d7e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
d7f0: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
d800: 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  i];.    }..    /
d810: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
d820: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
d830: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
d840: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
d850: 61 73 0a 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  as.    ** a P4_S
d860: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
d870: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
d880: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
d890: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
d8a0: 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20  .    ** kept in 
d8b0: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
d8c0: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
d8d0: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
d8e0: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
d8f0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
d900: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
d910: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d920: 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 26   bListSubprogs &
d930: 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  & pOp->p4type==P
d940: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
d950: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
d960: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
d970: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
d980: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
d990: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
d9a0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
d9b0: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
d9c0: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
d9d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d9e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
d9f0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
da00: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64  ->rc = sqlite3Vd
da10: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
da20: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 3b  nByte, nSub!=0);
da30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
da40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
da50: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
da60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
da70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
da80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
da90: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
daa0: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
dab0: 0a 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e  .        apSub[n
dac0: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
dad0: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
dae0: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
daf0: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
db00: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
db10: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
db20: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
db30: 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e  nRow += pOp->p4.
db40: 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20  pProgram->nOp;. 
db50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
db60: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3c   if( p->explain<
db70: 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  2 ) break;.    i
db80: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
db90: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 20 62 72 65  OP_Explain ) bre
dba0: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ak;.    if( pOp-
dbb0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
dbc0: 20 26 26 20 70 2d 3e 70 63 3e 31 20 29 20 62 72   && p->pc>1 ) br
dbd0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
dbe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dbf0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  .    if( db->u1.
dc00: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
dc10: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
dc20: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
dc30: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
dc40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
dc50: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
dc60: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
dc70: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 20 20 7d  r(p->rc));.    }
dc80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
dc90: 20 2a 7a 50 34 3b 0a 20 20 20 20 20 20 69 66 28   *zP4;.      if(
dca0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
dcb0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
dcc0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
dcd0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  .        pMem->u
dce0: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
dd10: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
dd20: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
dd30: 20 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e   .        pMem->
dd40: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
dd50: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
dd60: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
dd70: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
dd80: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
dd90: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
dda0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
ddb0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
ddc0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >z!=0 );.       
ddd0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
dde0: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
ddf0: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
de00: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
de10: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
de20: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  em++;.      }.. 
de30: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
de40: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
de50: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
de60: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20 70  /* P1 */.      p
de90: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d  Mem++;..      pM
dea0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
deb0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
dec0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
def0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
df00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
df10: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
df20: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
df30: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
df60: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
df70: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
df80: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
df90: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
dfa0: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P4 */.        
dfb0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
dfc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
dfd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
dfe0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
dff0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
e000: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
e010: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
e020: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
e030: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d  pOp, pMem->z, pM
e040: 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  em->szMalloc);. 
e050: 20 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d       if( zP4!=pM
e060: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20  em->z ){.       
e070: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20   pMem->n = 0;.  
e080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e090: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
e0a0: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
e0b0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20  _UTF8, 0);.     
e0c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e0d0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
e0e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  =0 );.        pM
e0f0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
e100: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
e110: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e120: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
e130: 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  8;.      }.     
e140: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
e150: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
e160: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  1 ){.        if(
e170: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
e180: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
e190: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
e1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
e1b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e1c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
e1d0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e1e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e1f0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e200: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
e210: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
e220: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ->n = 2;.       
e230: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e240: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
e250: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
e260: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
e270: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
e280: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
e290: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
e2a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e2b0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
e2c0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 20 20 69  MMENTS.        i
e2d0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
e2e0: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
e2f0: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
e300: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e310: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
e320: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  led );.         
e330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
e340: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
e350: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
e360: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
e370: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
e380: 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61  pMem->n = displa
e390: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
e3a0: 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29  4, pMem->z, 500)
e3b0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e3c0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
e3d0: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  8;.#else.       
e3e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e3f0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e410: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
e420: 64 69 66 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  dif.      }..   
e430: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
e440: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
e450: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 20 20 70  lain-1);.      p
e460: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
e470: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
e480: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
e490: 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _OK;.      rc = 
e4a0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20  SQLITE_ROW;.    
e4b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e4c0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
e4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
e4e0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
e4f0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
e500: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
e510: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
e520: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
e530: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
e540: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
e550: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
e560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
e570: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
e580: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
e590: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
e5a0: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
e5b0: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
e5c0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
e5d0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
e5e0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
e5f0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
e600: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
e610: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
e620: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
e630: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
e640: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
e650: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
e660: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
e670: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
e680: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e690: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
e6a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
e6b0: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
e6c0: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
e6d0: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
e6e0: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
e6f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
e700: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
e710: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
e720: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
e730: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
e740: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
e750: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
e760: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
e770: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
e780: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
e790: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
e7a0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
e7b0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
e7c0: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
e7d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
e7e0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
e7f0: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
e800: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
e810: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
e820: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
e830: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
e840: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
e850: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
e860: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
e870: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
e880: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
e890: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
e8a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e8b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
e8c0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
e8d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
e8e0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
e8f0: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
e900: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
e910: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
e920: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
e930: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
e940: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41  IOTRACE */../* A
e950: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
e960: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
e970: 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  bes bulk memory 
e980: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
e990: 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f  e.** by subcompo
e9a0: 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61  nents of a prepa
e9b0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
e9c0: 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  Space is allocat
e9d0: 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52  ed out.** of a R
e9e0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
e9f0: 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63  ect by the alloc
ea00: 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
ea10: 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74  below..*/.struct
ea20: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b   ReusableSpace {
ea30: 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20  .  u8 *pSpace;  
ea40: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c          /* Avail
ea50: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
ea60: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ea70: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
ea80: 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  f available memo
ea90: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65  ry */.  int nNee
eaa0: 64 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ded;         /* 
eab0: 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74  Total bytes that
eac0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c   could not be al
ead0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
eae0: 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74  * Try to allocat
eaf0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
eb00: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
eb10: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20  bulk memory for 
eb20: 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  pBuf.** from the
eb30: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
eb40: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
eb50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
eb60: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d  allocated.** mem
eb70: 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ory on success. 
eb80: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
eb90: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
eba0: 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52  able in the.** R
ebb0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
ebc0: 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ect, increase th
ebd0: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e  e ReusableSpace.
ebe0: 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65  nNeeded.** value
ebf0: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e   by the amount n
ec00: 65 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eeded and return
ec10: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
ec20: 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74  pBuf is not init
ec30: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74  ially NULL, that
ec40: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
ec50: 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61  memory has alrea
ec60: 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  dy.** been alloc
ec70: 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
ec80: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
ec90: 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65  tine, so just re
eca0: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
ecb0: 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65  f pBuf and leave
ecc0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75   ReusableSpace u
ecd0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
ece0: 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69  This allocator i
ecf0: 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65  s employed to re
ed00: 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73  purpose unused s
ed10: 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20  lots at the end 
ed20: 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  of the.** opcode
ed30: 20 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72   array of prepar
ed40: 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68  ed state for oth
ed50: 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20  er memory needs 
ed60: 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a  of the prepared.
ed70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ** statement..*/
ed80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
ed90: 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75  locSpace(.  stru
eda0: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
edb0: 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65   *p,  /* Bulk me
edc0: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
edd0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
ede0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee00: 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69  Pointer to a pri
ee10: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
ee20: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee40: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  Bytes of memory 
ee50: 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  needed */.){.  a
ee60: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
ee70: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70  E_ALIGNMENT(p->p
ee80: 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20  Space) );.  if( 
ee90: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  pBuf==0 ){.    n
eea0: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
eeb0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
eec0: 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20  yte <= p->nFree 
eed0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65  ){.      p->nFre
eee0: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  e -= nByte;.    
eef0: 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70    pBuf = &p->pSp
ef00: 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20  ace[p->nFree];. 
ef10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef20: 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42  p->nNeeded += nB
ef30: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  yte;.    }.  }. 
ef40: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
ef50: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42  YTE_ALIGNMENT(pB
ef60: 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  uf) );.  return 
ef70: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
ef80: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
ef90: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
efa0: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
efb0: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
efc0: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
efd0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
efe0: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
eff0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
f000: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
f010: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
f020: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
f030: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
f040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
f050: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
f060: 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  NIT || p->magic=
f070: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45  =VDBE_MAGIC_RESE
f080: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
f090: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
f0a0: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
f0b0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
f0c0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
f0d0: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
f0e0: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
f0f0: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
f100: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
f110: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
f120: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
f130: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f140: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f150: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
f160: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
f170: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
f180: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
f190: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
f1a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f1b0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
f1c0: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
f1d0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
f1e0: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
f1f0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
f200: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
f210: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
f220: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
f230: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
f240: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
f250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f260: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
f270: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
f280: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
f290: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
f2a0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f2b0: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
f2c0: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
f2d0: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
f2e0: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
f2f0: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
f300: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f310: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
f320: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
f330: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65  as allocating re
f340: 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74  gisters and init
f350: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
f360: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
f370: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
f380: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
f390: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
f3a0: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
f3b0: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
f3c0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
f3d0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
f3e0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
f3f0: 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  lled exactly onc
f400: 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61  e on each virtua
f410: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
f420: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
f430: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
f440: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
f450: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
f460: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
f470: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
f480: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72  e is called, fur
f490: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
f4a0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
f4b0: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
f4c0: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
f4d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
f4e0: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
f4f0: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
f500: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
f510: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
f520: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
f530: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
f540: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
f550: 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
f560: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
f570: 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
f580: 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
f590: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
f5a0: 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
f5b0: 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
f5c0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
f5d0: 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
f5e0: 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
f5f0: 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
f600: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
f610: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
f620: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f640: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
f650: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f670: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
f680: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
f690: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
f6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f6b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f6c0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
f6d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
f6e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f6f0: 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
f700: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f730: 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
f740: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
f750: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
f760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f770: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
f780: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
f790: 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
f7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f7b0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
f7c0: 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
f7d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
f800: 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  nter */.  struct
f810: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 78   ReusableSpace x
f820: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;        /* Reus
f830: 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  able bulk memory
f840: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
f850: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f860: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
f870: 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
f880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
f890: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
f8a0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
f8b0: 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e  ert( pParse==p->
f8c0: 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d  pParse );.  db =
f8d0: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
f8e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f8f0: 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
f900: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
f910: 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
f920: 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
f930: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
f940: 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
f950: 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20  ->nMaxArg;.  .  
f960: 2f 2a 20 45 61 63 68 20 63 75 72 73 6f 72 20 75  /* Each cursor u
f970: 73 65 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ses a memory cel
f980: 6c 2e 20 20 54 68 65 20 66 69 72 73 74 20 63 75  l.  The first cu
f990: 72 73 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20  rsor (cursor 0) 
f9a0: 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65  can.  ** use aMe
f9b0: 6d 5b 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f  m[0] which is no
f9c0: 74 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 64  t otherwise used
f9d0: 20 62 79 20 74 68 65 20 56 44 42 45 20 70 72 6f   by the VDBE pro
f9e0: 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a  gram.  Allocate.
f9f0: 20 20 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68    ** space at th
fa00: 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20  e end of aMem[] 
fa10: 66 6f 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e  for cursors 1 an
fa20: 64 20 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20  d greater..  ** 
fa30: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
fa40: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
fa50: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
fa60: 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f  or;.  if( nCurso
fa70: 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29  r==0 && nMem>0 )
fa80: 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61   nMem++;  /* Spa
fa90: 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65  ce for aMem[0] e
faa0: 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20  ven if not used 
fab0: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
fac0: 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75  out how much reu
fad0: 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20  sable memory is 
fae0: 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65  available at the
faf0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a   end of the.  **
fb00: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
fb10: 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72  This extra memor
fb20: 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f  y will be reallo
fb30: 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20  cated for other 
fb40: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  elements.  ** of
fb50: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
fb60: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
fb70: 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  n = ROUND8(sizeo
fb80: 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20  f(Op)*p->nOp);  
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
fba0: 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d  ytes of opcode m
fbb0: 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20  emory used */.  
fbc0: 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28 75 38  x.pSpace = &((u8
fbd0: 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20  *)p->aOp)[n];   
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
fbf0: 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d  nused opcode mem
fc00: 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
fc10: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
fc20: 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20  NMENT(x.pSpace) 
fc30: 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52  );.  x.nFree = R
fc40: 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65  OUNDDOWN8(pParse
fc50: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29  ->szOpAlloc - n)
fc60: 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75  ;  /* Bytes of u
fc70: 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  nused memory */.
fc80: 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65    assert( x.nFre
fc90: 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e>=0 );.  assert
fca0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
fcb0: 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65  GNMENT(&x.pSpace
fcc0: 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20  [x.nFree]) );.. 
fcd0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
fce0: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
fcf0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
fd00: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
fd10: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
fd20: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
fd30: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
fd40: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
fd50: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
fd60: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65  = 10;.  }.  p->e
fd70: 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  xpired = 0;..  /
fd80: 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
fd90: 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
fda0: 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
fdb0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
fdc0: 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a   one or two.  **
fdd0: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
fde0: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
fdf0: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
fe00: 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  sed memory at th
fe10: 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
fe20: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
fe30: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
fe40: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
fe50: 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
fe60: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
fe70: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
fe80: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
fe90: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
fea0: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
feb0: 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
fec0: 72 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  r using a fresh 
fed0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
fee0: 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
fef0: 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
ff00: 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
ff10: 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
ff20: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
ff30: 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
ff40: 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  ver memory at th
ff50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
ff60: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
ff70: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
ff80: 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
ff90: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
ffa0: 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
ffb0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
ffc0: 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
ffd0: 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b    x.nNeeded = 0;
ffe0: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61  .    p->aMem = a
fff0: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
10000 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
10010 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d  of(Mem));.    p-
10020 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
10030 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20  ce(&x, p->aVar, 
10040 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
10050 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20  );.    p->apArg 
10060 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
10070 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a   p->apArg, nArg*
10080 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20  sizeof(Mem*));. 
10090 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
100a0 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
100b0 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
100c0 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
100d0 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  *));.#ifdef SQLI
100e0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
100f0 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d  CANSTATUS.    p-
10100 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
10110 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78  pace(&x, p->anEx
10120 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
10130 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
10140 20 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65      if( x.nNeede
10150 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
10160 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e    x.pSpace = p->
10170 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
10180 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
10190 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20   x.nNeeded);.   
101a0 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65   x.nFree = x.nNe
101b0 65 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20  eded;.  }while( 
101c0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
101d0 64 20 29 3b 0a 0a 20 20 70 2d 3e 70 56 4c 69 73  d );..  p->pVLis
101e0 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  t = pParse->pVLi
101f0 73 74 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 56  st;.  pParse->pV
10200 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e  List =  0;.  p->
10210 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65  explain = pParse
10220 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28  ->explain;.  if(
10230 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10240 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  d ){.    p->nVar
10250 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75   = 0;.    p->nCu
10260 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rsor = 0;.    p-
10270 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c  >nMem = 0;.  }el
10280 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73  se{.    p->nCurs
10290 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
102a0 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
102b0 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69  ar)nVar;.    ini
102c0 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  tMemArray(p->aVa
102d0 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d  r, nVar, db, MEM
102e0 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e  _Null);.    p->n
102f0 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20  Mem = nMem;.    
10300 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
10310 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20  aMem, nMem, db, 
10320 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a  MEM_Undefined);.
10330 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70      memset(p->ap
10340 43 73 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a  Csr, 0, nCursor*
10350 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
10360 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  r*));.#ifdef SQL
10370 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
10380 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 6d  SCANSTATUS.    m
10390 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c  emset(p->anExec,
103a0 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f   0, p->nOp*sizeo
103b0 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
103c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
103d0 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
103e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
103f0 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
10400 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
10410 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
10420 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
10430 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
10440 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
10450 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
10460 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
10470 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
10480 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10490 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e  .  assert( pCx->
104a0 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e  pBtx==0 || pCx->
104b0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
104c0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69  E_BTREE );.  swi
104d0 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79  tch( pCx->eCurTy
104e0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43  pe ){.    case C
104f0 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b  URTYPE_SORTER: {
10500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10510 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
10520 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20  >db, pCx);.     
10530 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10540 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42    case CURTYPE_B
10550 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  TREE: {.      if
10560 28 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72  ( pCx->isEphemer
10570 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  al ){.        if
10580 28 20 70 43 78 2d 3e 70 42 74 78 20 29 20 73 71  ( pCx->pBtx ) sq
10590 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
105a0 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20  pCx->pBtx);.    
105b0 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
105c0 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
105d0 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
105e0 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
105f0 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  s, by.        **
10600 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
10610 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
10620 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10630 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
10640 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
10650 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10660 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70  Cursor(pCx->uc.p
10670 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
10680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10690 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
106a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
106b0 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55  ABLE.    case CU
106c0 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20  RTYPE_VTAB: {.  
106d0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
106e0 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d  _cursor *pVCur =
106f0 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a   pCx->uc.pVCur;.
10700 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69        const sqli
10710 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
10720 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74  ule = pVCur->pVt
10730 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
10740 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72     assert( pVCur
10750 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20  ->pVtab->nRef>0 
10760 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e  );.      pVCur->
10770 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pVtab->nRef--;. 
10780 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43       pModule->xC
10790 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20  lose(pVCur);.   
107a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
107b0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
107c0 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
107d0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72  rsors in the cur
107e0 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73  rent frame..*/.s
107f0 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
10800 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56  CursorsInFrame(V
10810 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
10820 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
10830 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10840 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
10850 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
10860 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
10870 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
10880 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
10890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
108a0 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
108b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
108c0 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
108d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
108e0 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
108f0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
10900 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
10910 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
10920 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
10930 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
10940 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
10950 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
10960 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
10970 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
10980 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
10990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
109a0 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
109b0 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
109c0 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
109d0 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c   pFrame->v;.  cl
109e0 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
109f0 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  e(v);.#ifdef SQL
10a00 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
10a10 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e  SCANSTATUS.  v->
10a20 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d  anExec = pFrame-
10a30 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a  >anExec;.#endif.
10a40 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
10a50 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
10a60 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
10a70 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
10a80 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
10a90 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
10aa0 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
10ab0 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
10ac0 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
10ad0 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
10ae0 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
10af0 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
10b00 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
10b10 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
10b20 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d  Change;.  v->db-
10b30 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
10b40 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20  e->nDbChange;.  
10b50 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
10b60 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20  eAuxData(v->db, 
10b70 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &v->pAuxData, -1
10b80 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44  , 0);.  v->pAuxD
10b90 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41  ata = pFrame->pA
10ba0 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65  uxData;.  pFrame
10bb0 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a  ->pAuxData = 0;.
10bc0 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
10bd0 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
10be0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
10bf0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
10c00 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
10c10 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
10c20 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
10c30 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
10c40 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
10c50 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
10c60 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
10c70 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
10c80 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
10c90 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
10ca0 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
10cb0 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
10cc0 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
10cd0 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
10ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
10cf0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
10d00 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
10d10 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
10d20 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
10d30 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
10d40 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
10d50 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
10d60 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
10d70 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
10d80 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
10d90 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d  (pFrame);.    p-
10da0 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20  >pFrame = 0;.   
10db0 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a   p->nFrame = 0;.
10dc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
10dd0 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  >nFrame==0 );.  
10de0 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
10df0 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ame(p);.  if( p-
10e00 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c  >aMem ){.    rel
10e10 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
10e20 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  aMem, p->nMem);.
10e30 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
10e40 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20  pDelFrame ){.   
10e50 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c   VdbeFrame *pDel
10e60 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b   = p->pDelFrame;
10e70 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d  .    p->pDelFram
10e80 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e  e = pDel->pParen
10e90 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
10ea0 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44  beFrameDelete(pD
10eb0 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  el);.  }..  /* D
10ec0 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74  elete any auxdat
10ed0 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61  a allocations ma
10ee0 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a  de by the VM */.
10ef0 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74    if( p->pAuxDat
10f00 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44  a ) sqlite3VdbeD
10f10 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e  eleteAuxData(p->
10f20 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61  db, &p->pAuxData
10f30 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  , -1, 0);.  asse
10f40 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d  rt( p->pAuxData=
10f50 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  =0 );.}../*.** S
10f60 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
10f70 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
10f80 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
10f90 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
10fa0 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
10fb0 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
10fc0 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
10fd0 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
10fe0 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
10ff0 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
11000 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
11010 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
11020 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
11030 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
11040 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
11050 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
11060 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11070 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
11080 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
11090 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b  olumn){.  int n;
110a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
110b0 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70   p->db;..  if( p
110c0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a  ->nResColumn ){.
110d0 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
110e0 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
110f0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
11100 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 20 20 73  OLNAME_N);.    s
11110 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11120 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
11130 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c   }.  n = nResCol
11140 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
11150 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
11160 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
11170 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
11180 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
11190 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
111a0 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
111b0 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
111c0 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
111d0 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28  .  initMemArray(
111e0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20  p->aColName, n, 
111f0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d  db, MEM_Null);.}
11200 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
11210 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
11220 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
11230 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
11240 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
11250 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
11260 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
11270 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
11280 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
11290 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
112a0 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
112b0 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
112c0 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
112d0 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
112e0 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
112f0 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
11300 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
11310 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
11320 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11330 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
11340 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
11350 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
11360 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
11370 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
11380 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
11390 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
113a0 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
113b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
113c0 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
113d0 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
11400 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
11410 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11430 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
11440 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
11450 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
11480 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
11490 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
114a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
114b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
114c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
114d0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
114e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
114f0 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
11500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11510 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
11520 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
11530 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
11540 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
11550 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
11560 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
11570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
11580 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
11590 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
115a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
115b0 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
115c0 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
115d0 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
115e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
115f0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  M_BKPT;.  }.  as
11600 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
11610 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
11620 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
11630 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
11640 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
11650 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
11660 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
11670 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
11680 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
11690 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
116a0 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
116b0 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
116c0 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
116d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
116e0 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
116f0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11700 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
11710 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
11720 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
11730 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
11740 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
11750 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
11760 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
11770 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
11780 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
11790 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
117a0 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
117b0 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
117c0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
117d0 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
117e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
117f0 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
11800 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
11810 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
11820 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
11830 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
11840 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
11850 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11860 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
11870 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
11880 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
11890 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
118a0 6d 69 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20  mit using a.    
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
118c0 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
118d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
118e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
118f0 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
11900 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11910 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11920 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
11930 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
11940 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
11950 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
11960 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
11970 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
11980 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
11990 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
119a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
119b0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
119c0 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
119d0 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
119e0 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
119f0 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
11a00 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
11a10 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
11a20 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
11a30 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
11a40 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
11a50 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
11a60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
11a70 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
11a80 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
11a90 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
11aa0 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
11ab0 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
11ac0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
11ad0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
11ae0 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
11af0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
11b00 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
11b10 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
11b20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
11b30 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
11b40 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
11b50 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
11b60 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
11b70 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
11b80 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
11b90 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
11ba0 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
11bb0 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
11bc0 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
11bd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
11be0 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
11bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
11c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
11c10 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
11c20 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
11c30 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
11c40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
11c50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
11c60 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
11c70 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11c80 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11c90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
11ca0 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
11cb0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  t) ){.      /* W
11cc0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
11cd0 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e  database might n
11ce0 65 65 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  eed a master jou
11cf0 72 6e 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f  rnal depends upo
11d00 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a  n.      ** its j
11d10 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f  ournal mode (amo
11d20 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29  ng other things)
11d30 2e 20 20 54 68 69 73 20 6d 61 74 72 69 78 20 64  .  This matrix d
11d40 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a  etermines which.
11d50 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
11d60 20 6d 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73   modes use a mas
11d70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
11d80 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a  which do not */.
11d90 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
11da0 73 74 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b  st u8 aMJNeeded[
11db0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
11dc0 20 44 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c   DELETE   */  1,
11dd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53  .        /* PERS
11de0 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20  IST   */ 1,.    
11df0 20 20 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20      /* OFF      
11e00 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
11e10 2a 20 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31  * TRUNCATE  */ 1
11e20 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  ,.        /* MEM
11e30 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  ORY    */ 0,.   
11e40 20 20 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20       /* WAL     
11e50 20 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a    */ 0.      };.
11e60 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
11e70 67 65 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20  ger;   /* Pager 
11e80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11e90 70 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65  pBt */.      nee
11ea0 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
11eb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11ec0 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
11ed0 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
11ee0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
11ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
11f00 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[i].safety_l
11f10 65 76 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43  evel!=PAGER_SYNC
11f20 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20  HRONOUS_OFF.    
11f30 20 20 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b     && aMJNeeded[
11f40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a  sqlite3PagerGetJ
11f50 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
11f60 72 29 5d 0a 20 20 20 20 20 20 20 26 26 20 73 71  r)].       && sq
11f70 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64  lite3PagerIsMemd
11f80 62 28 70 50 61 67 65 72 29 3d 3d 30 0a 20 20 20  b(pPager)==0.   
11f90 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61     ){ .        a
11fa0 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20  ssert( i!=1 );. 
11fb0 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b         nTrans++;
11fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
11fd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11fe0 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
11ff0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
12000 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12010 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
12020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12030 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
12040 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
12050 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
12060 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12070 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
12080 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
12090 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
120a0 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
120b0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
120c0 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
120d0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
120e0 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
120f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12110 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
12120 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
12130 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
12140 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
12150 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
12160 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
12170 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
12180 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
12190 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
121a0 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
121b0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
121c0 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
121d0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
121e0 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
121f0 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
12200 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
12210 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
12220 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
12230 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
12240 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
12250 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
12260 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
12270 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
12280 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
12290 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
122a0 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
122b0 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
122c0 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
122d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
122e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
122f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
12300 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
12310 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
12320 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
12330 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
12340 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
12350 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
12360 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12370 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12380 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
12390 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
123a0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
123b0 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
123c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
123d0 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
123e0 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
123f0 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
12400 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
12410 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
12420 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
12430 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12440 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
12450 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
12460 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
12470 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
12480 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
12490 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
124a0 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
124b0 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
124c0 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
124d0 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
124e0 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
124f0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
12500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
12510 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
12520 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
12530 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
12540 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12550 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12560 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
12570 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12580 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12590 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
125a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
125b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
125c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
125d0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
125e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
125f0 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
12600 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
12610 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
12620 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
12630 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
12640 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
12650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
12660 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
12670 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
12680 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
12690 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
126a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
126b0 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
126c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
126d0 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
126e0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
126f0 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
12700 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
12710 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
12720 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
12730 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
12740 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
12750 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
12760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
12770 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
12780 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
12790 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
127a0 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
127b0 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
127c0 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
127d0 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
127e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
127f0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
12800 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
12810 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
12820 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
12830 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
12840 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
12850 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
12860 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
12870 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
12880 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
12890 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  BKPT;.    do {. 
128a0 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
128b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
128c0 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
128d0 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
128e0 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
128f0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
12900 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
12910 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
12920 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
12930 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12940 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
12950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
12960 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
12970 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
12980 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
12990 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
129a0 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
129b0 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
129c0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
129d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
129e0 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
129f0 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
12a00 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
12a10 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
12a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12a30 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
12a40 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
12a50 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
12a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
12a90 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
12aa0 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
12ab0 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
12ac0 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
12ad0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12ae0 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
12af0 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
12b00 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
12b10 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
12b20 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
12b30 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
12b40 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
12b50 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
12b60 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
12b70 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
12b80 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
12b90 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
12ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
12bb0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
12bc0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
12bd0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
12be0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
12bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
12c00 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
12c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12c20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
12c30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
12c40 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
12c50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
12c60 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
12c70 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
12c80 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
12c90 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
12ca0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
12cb0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
12cc0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
12cd0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
12ce0 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
12cf0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
12d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
12d20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12d30 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
12d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12d50 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
12d60 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
12d70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
12d80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12d90 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
12da0 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
12db0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
12dc0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
12dd0 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
12de0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
12df0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
12e00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
12e10 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
12e20 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
12e30 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
12e40 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
12e50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
12e60 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
12e70 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
12e80 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
12e90 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
12ea0 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
12eb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12ec0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
12ed0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12ee0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12ef0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
12f00 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
12f10 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
12f20 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
12f30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
12f40 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
12f50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
12f60 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
12f70 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
12f80 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
12f90 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
12fa0 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
12fb0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
12fc0 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
12fd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
12fe0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
12ff0 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
13000 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
13010 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
13020 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
13030 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
13040 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
13050 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13070 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13080 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
13090 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
130a0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
130b0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
130c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
130d0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
130e0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
130f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13100 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13110 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
13120 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13130 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
13140 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
13150 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
13160 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
13170 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
13180 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d     */.    if( 0=
13190 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
131a0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
131b0 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
131c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
131d0 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
131e0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
131f0 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
13200 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
13210 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
13220 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13230 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
13240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13250 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
13260 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
13270 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13280 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
13290 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
132a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
132b0 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
132c0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
132d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
132e0 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
132f0 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
13300 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
13310 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
13320 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
13330 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
13340 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
13350 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
13360 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13370 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
13380 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
13390 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
133a0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
133b0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
133c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
133d0 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
133e0 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
133f0 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
13400 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13410 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
13420 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
13430 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
13440 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
13450 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13460 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
13470 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
13480 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
13490 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
134a0 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
134b0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
134c0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
134d0 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
134e0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
134f0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13500 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
13510 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
13520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
13530 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
13540 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
13550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13560 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13570 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
13580 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
13590 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
135a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
135b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
135c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
135d0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
135e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
135f0 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
13600 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13610 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
13620 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
13630 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
13640 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
13650 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
13660 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
13670 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
13680 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
13690 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
136a0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
136b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
136c0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
136d0 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
136e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
136f0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13700 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
13710 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13720 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13730 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
13740 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
13750 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
13760 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
13770 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
13780 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
13790 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
137a0 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
137b0 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
137c0 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
137d0 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
137e0 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
137f0 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
13800 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
13810 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
13820 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
13830 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
13840 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
13850 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
13860 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
13870 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
13880 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
13890 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
138a0 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
138b0 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
138c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
138d0 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
138e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
138f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
13900 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
13910 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
13920 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
13930 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
13940 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
13950 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
13960 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
13970 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
13980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
13990 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
139a0 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
139b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
139c0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
139d0 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
139e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
139f0 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
13a00 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
13a10 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
13a20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13a30 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
13a40 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
13a50 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
13a60 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
13a70 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
13a80 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
13a90 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
13aa0 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
13ab0 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
13ac0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
13ad0 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
13ae0 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
13af0 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
13b00 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
13b10 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
13b20 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
13b30 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
13b40 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
13b50 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
13b60 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
13b70 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
13b80 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
13b90 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
13ba0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
13bb0 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
13bc0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
13bd0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
13be0 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
13bf0 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
13c00 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
13c10 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
13c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13c30 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
13c40 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
13c50 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
13c60 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
13c70 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
13c80 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
13c90 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
13ca0 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
13cb0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
13cc0 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
13cd0 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
13ce0 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
13cf0 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
13d00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
13d10 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
13d20 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
13d30 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
13d40 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
13d50 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
13d60 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
13d70 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
13d80 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
13d90 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
13da0 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
13db0 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
13dc0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
13dd0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13de0 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
13df0 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
13e00 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
13e10 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
13e20 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
13e30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
13e40 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
13e50 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
13e60 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
13e70 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
13e80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
13e90 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
13ea0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
13eb0 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
13ec0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
13ed0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
13ee0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
13ef0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
13f00 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
13f10 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73  INE int vdbeClos
13f20 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
13f30 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
13f40 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
13f50 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
13f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13f70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
13f80 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
13f90 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
13fa0 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  -1;..  assert( e
13fb0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
13fc0 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
13fd0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
13fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
13ff0 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
14000 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53  .  assert( p->iS
14010 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
14020 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
14030 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
14040 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
14050 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69  Db; i++){ .    i
14060 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
14070 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  OK;.    Btree *p
14080 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
14090 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
140a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
140b0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
140c0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
140d0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
140e0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
140f0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
14100 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
14110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14120 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
14130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
14140 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
14150 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
14160 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14170 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
14180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
141a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
141b0 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
141c0 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74   }.  }.  db->nSt
141d0 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e  atement--;.  p->
141e0 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
141f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
14210 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
14220 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
14230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
14240 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
14250 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14260 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
14270 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14290 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
142a0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
142b0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
142c0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
142d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
142e0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
142f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14300 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
14310 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
14320 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  re the .  ** dat
14330 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
14340 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
14350 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
14360 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
14370 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  en .  ** the sta
14380 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14390 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
143a0 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  */.  if( eOp==SA
143b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
143c0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
143d0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
143e0 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
143f0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
14400 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
14410 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a  DefImmCons;.  }.
14420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
14430 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
14440 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
14450 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
14460 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74    if( p->db->nSt
14470 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
14480 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
14490 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65  return vdbeClose
144a0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70  Statement(p, eOp
144b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
144c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
144d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
144e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
144f0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
14500 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
14510 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
14520 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
14530 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
14540 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
14550 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
14560 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
14570 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
14580 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
14590 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
145a0 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
145b0 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
145c0 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
145d0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
145e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
145f0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
14600 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
14610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
14620 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
14630 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
14640 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
14650 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
14660 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
14670 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
14680 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
14690 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
146a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
146b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
146c0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
146d0 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
146e0 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
146f0 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
14700 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14710 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
14720 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
14730 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
14740 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
14750 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
14760 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
14770 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
14780 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
14790 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
147a0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
147b0 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
147c0 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
147d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
147e0 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47  Error(p, "FOREIG
147f0 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
14800 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
14810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
14820 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
14830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
14840 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
14850 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14860 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
14870 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
14880 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
14890 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
148a0 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
148b0 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
148c0 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
148d0 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
148e0 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
148f0 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
14900 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
14910 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14920 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
14930 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
14940 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
14950 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
14960 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
14970 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
14980 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
14990 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
149a0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
149b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
149c0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
149d0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
149e0 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
149f0 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
14a00 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
14a10 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
14a20 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
14a30 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
14a40 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
14a50 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
14a60 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
14a70 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
14a80 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
14a90 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
14aa0 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
14ab0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
14ae0 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
14af0 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
14b00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14b10 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
14b20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
14b30 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
14b40 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
14b50 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
14b60 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
14b70 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
14b80 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
14b90 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
14ba0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
14bb0 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
14bc0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
14bd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
14be0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
14bf0 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
14c00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
14c10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
14c20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
14c30 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
14c40 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
14c50 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
14c60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
14c70 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
14c80 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
14c90 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
14ca0 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
14cb0 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
14cc0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
14cd0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14ce0 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
14cf0 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
14d00 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
14d10 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
14d20 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
14d30 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
14d40 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61   */..  if( p->ma
14d50 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
14d60 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
14d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14d80 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14d90 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
14da0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
14db0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
14dc0 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
14dd0 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  p);.  checkActiv
14de0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
14df0 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
14e00 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
14e10 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
14e20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
14e30 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
14e40 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
14e50 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
14e60 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
14e70 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
14e80 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
14e90 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
14ea0 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
14eb0 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
14ec0 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
14ed0 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
14ee0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
14ef0 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
14f00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
14f10 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
14f20 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
14f30 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
14f40 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
14f50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
14f60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14f70 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
14f80 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
14f90 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
14fa0 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
14fb0 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
14fc0 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
14fd0 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
14fe0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
14ff0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
15020 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
15030 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
15040 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
15050 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
15060 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
15070 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
15080 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
15090 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
150a0 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
150b0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
150c0 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
150d0 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
150e0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
150f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
15100 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
15110 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
15120 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
15130 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
15140 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
15150 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
15160 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
15170 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
15180 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
15190 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
151a0 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
151b0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
151c0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
151d0 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
151e0 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
151f0 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
15200 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
15210 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
15220 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
15230 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
15240 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
15250 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
15260 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
15270 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
15280 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
15290 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
152a0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
152b0 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
152c0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
152d0 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
152e0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
152f0 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
15300 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
15310 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
15320 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
15330 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
15340 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
15350 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
15360 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
15370 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
15380 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
15390 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
153a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
153b0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
153c0 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
153d0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
153e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
153f0 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
15400 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
15410 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
15420 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
15430 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
15440 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
15450 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
15460 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
15470 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
15480 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
15490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
154a0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
154b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
154c0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
154d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
154e0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
154f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15500 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
15510 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
15520 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
15530 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
15540 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
15560 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
15570 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
15580 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
15590 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
155a0 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
155b0 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
155c0 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
155d0 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
155e0 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
155f0 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
15600 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
15610 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
15620 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
15630 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
15640 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
15650 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
15660 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
15670 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
15680 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
15690 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
156a0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
156b0 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
156c0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
156d0 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
156e0 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
156f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
15700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
15710 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
15720 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
15730 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
15740 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15750 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
15760 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
15770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
15790 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
157a0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
157b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
157c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
157d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
157e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
157f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
15810 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
15820 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
15830 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
15840 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
15850 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
15860 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
15870 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
15880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
15890 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
158a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
158b0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
158c0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
158d0 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
158e0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
158f0 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
15900 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
15910 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
15920 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
15930 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
15940 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
15950 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
15960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
15970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
15980 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
15990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
159a0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
159b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
159c0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
159d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
159e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
159f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15a00 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
15a10 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
15a20 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
15a30 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
15a40 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
15a50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15a60 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
15a70 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
15a80 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
15a90 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
15aa0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
15ab0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
15ac0 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
15ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
15ae0 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
15af0 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
15b00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
15b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15b20 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
15b30 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
15b40 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
15b50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
15b60 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
15b70 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
15b80 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
15b90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
15ba0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15bb0 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
15bc0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
15bd0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
15be0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
15bf0 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
15c00 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
15c10 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
15c20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
15c30 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
15c40 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
15c50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15c60 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
15c70 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
15c80 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
15c90 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
15ca0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15cb0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15cc0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15cd0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
15ce0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15cf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
15d00 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
15d10 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
15d20 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
15d30 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
15d40 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
15d50 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
15d60 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
15d70 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
15d80 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
15d90 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
15da0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
15db0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
15dc0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
15dd0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
15de0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
15df0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
15e00 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
15e10 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
15e20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
15e30 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
15e40 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
15e50 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
15e60 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
15e70 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
15e80 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
15e90 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
15ea0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15eb0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
15ec0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
15ed0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
15ee0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
15ef0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
15f00 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
15f10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15f20 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15f30 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
15f40 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
15f50 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
15f60 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
15f70 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
15f80 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
15f90 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
15fa0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
15fb0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
15fc0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
15fd0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
15fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15ff0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
16000 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
16010 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
16020 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
16030 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
16040 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
16050 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
16060 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
16070 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
16080 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
16090 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
160a0 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
160b0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
160c0 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
160d0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
160e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
160f0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
16100 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
16110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
16120 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
16130 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
16140 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
16150 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
16160 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
16170 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
16180 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
16190 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
161a0 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
161b0 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
161c0 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
161d0 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
161e0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
161f0 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
16200 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
16210 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
16220 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
16230 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
16240 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
16250 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
16260 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
16270 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
16280 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
16290 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
162a0 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
162b0 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
162c0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
162d0 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
162e0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
162f0 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
16300 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
16310 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
16320 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
16330 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
16340 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16350 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16360 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
16370 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
16380 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
16390 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
163a0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
163b0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
163c0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
163d0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
163e0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
163f0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
16400 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
16410 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
16420 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
16430 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
16440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
16450 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
16460 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
16470 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
16480 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
16490 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
164a0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
164b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
164c0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
164d0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
164e0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
164f0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
16500 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
16510 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
16520 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
16530 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
16540 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
16550 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
16560 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
16570 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
16580 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
16590 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
165a0 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
165b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
165c0 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
165d0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
165e0 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
165f0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
16600 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
16610 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
16620 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
16630 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
16640 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
16650 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
16660 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
16670 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
16680 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
16690 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
166a0 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
166b0 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
166c0 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
166d0 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
166e0 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
166f0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
16700 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
16710 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
16720 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
16730 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
16740 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
16750 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
16760 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
16770 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
16780 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
16790 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
167a0 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
167b0 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
167c0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
167d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
167e0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
167f0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
16800 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
16810 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
16820 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
16830 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
16840 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
16850 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73  Malloc--;.  }els
16860 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29  e if( db->pErr )
16870 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
16880 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45  ueSetNull(db->pE
16890 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65  rr);.  }.  db->e
168a0 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72  rrCode = rc;.  r
168b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
168c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
168d0 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
168e0 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
168f0 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
16900 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
16910 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
16920 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
16930 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
16940 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
16950 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
16960 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
16970 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
16980 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
16990 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
169a0 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
169b0 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
169c0 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
169d0 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
169e0 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
169f0 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
16a00 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
16a10 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
16a20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
16a30 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
16a40 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
16a50 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16a60 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
16a70 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
16a80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
16a90 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
16aa0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
16ab0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
16ac0 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
16ad0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
16ae0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
16af0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
16b00 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
16b10 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
16b20 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
16b30 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
16b40 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
16b50 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
16b60 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
16b70 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
16b80 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
16b90 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
16ba0 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
16bb0 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
16bc0 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
16bd0 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
16be0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
16bf0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
16c00 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
16c10 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
16c20 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
16c30 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
16c40 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
16c50 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
16c60 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
16c70 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
16c80 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
16c90 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
16ca0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
16cb0 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
16cc0 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   i;.#endif..  sq
16cd0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
16ce0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
16cf0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
16d00 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
16d10 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
16d20 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
16d30 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
16d40 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
16d50 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
16d60 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
16d70 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
16d80 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
16d90 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16da0 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
16db0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
16dc0 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
16dd0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
16de0 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
16df0 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
16e00 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
16e10 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
16e20 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
16e30 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
16e40 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
16e50 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
16e60 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
16e70 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
16e80 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
16e90 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
16ea0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
16eb0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
16ec0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
16ed0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
16ee0 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
16ef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16f00 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
16f10 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  p);.    if( p->r
16f20 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
16f30 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
16f40 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
16f50 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
16f60 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
16f70 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
16f80 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
16f90 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
16fa0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
16fb0 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
16fc0 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
16fd0 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
16fe0 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
16ff0 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
17000 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
17010 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
17020 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
17030 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
17040 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
17050 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
17060 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
17070 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
17080 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
17090 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65  ts and reclaim e
170a0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d  rror message mem
170b0 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ory..  */.#ifdef
170c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
170d0 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
170e0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
170f0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
17100 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
17110 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
17120 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
17130 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
17140 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
17150 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66  if( p->apCsr ) f
17160 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
17170 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
17180 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d  t( p->apCsr[i]==
17190 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  0 );.  if( p->aM
171a0 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  em ){.    for(i=
171b0 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  0; i<p->nMem; i+
171c0 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
171d0 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
171e0 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
171f0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
17200 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
17210 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
17220 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
17230 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
17240 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17250 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65  EBUG.  p->nWrite
17260 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
17270 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
17280 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
17290 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
172a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
172b0 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
172c0 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
172d0 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
172e0 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
172f0 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
17300 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17310 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
17320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
17330 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
17340 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
17350 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
17360 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
17370 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
17380 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
17390 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
173a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
173b0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
173c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
173d0 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
173e0 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
173f0 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
17400 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
17410 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
17420 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
17430 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
17440 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
17450 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
17460 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17470 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
17480 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
17490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
174a0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
174b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
174c0 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
174d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
174e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
174f0 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
17500 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
17510 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
17520 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
17530 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
17540 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
17550 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
17560 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
17570 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
17580 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
17590 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
175a0 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
175b0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
175c0 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
175d0 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
175e0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
175f0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
17600 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
17610 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
17620 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20  E_MAGIC_RESET;. 
17630 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
17640 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
17650 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
17660 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
17670 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
17680 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
17690 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
176a0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
176b0 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
176c0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
176d0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
176e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
176f0 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
17700 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
17710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
17720 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
17730 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
17740 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
17750 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
17760 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
17770 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
17780 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
17790 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
177a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
177b0 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
177c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
177d0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
177e0 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
177f0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
17800 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
17810 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
17820 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
17830 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
17840 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
17850 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
17860 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
17870 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
17880 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
17890 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
178a0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
178b0 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
178c0 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
178d0 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
178e0 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
178f0 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
17900 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
17910 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
17920 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
17930 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
17940 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
17950 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
17960 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
17970 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
17980 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
17990 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
179a0 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
179b0 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
179c0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
179d0 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
179e0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
179f0 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
17a00 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
17a10 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
17a20 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
17a30 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73  parameter corres
17a40 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65  ponds to bit 0 e
17a50 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tc.)..*/.void sq
17a60 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
17a70 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a  uxData(sqlite3 *
17a80 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70  db, AuxData **pp
17a90 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
17aa0 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a  ask){.  while( *
17ab0 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
17ac0 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
17ad0 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
17ae0 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41      || (pAux->iA
17af0 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20  uxOp==iOp.      
17b00 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75      && pAux->iAu
17b10 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20  xArg>=0.        
17b20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78    && (pAux->iAux
17b30 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
17b40 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
17b50 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20  x->iAuxArg)))). 
17b60 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
17b70 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78  case( pAux->iAux
17b80 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
17b90 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
17ba0 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20  teAux ){.       
17bb0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75   pAux->xDeleteAu
17bc0 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  x(pAux->pAux);. 
17bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
17be0 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75   = pAux->pNextAu
17bf0 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  x;.      sqlite3
17c00 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29  DbFree(db, pAux)
17c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17c20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
17c30 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20  extAux;.    }.  
17c40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
17c50 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
17c60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
17c70 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
17c80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17c90 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72  t,.** except for
17ca0 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20   object itself, 
17cb0 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76  which is preserv
17cc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ed..**.** The di
17cd0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
17ce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
17cf0 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
17d00 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
17d10 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
17d20 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
17d30 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
17d40 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
17d50 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
17d60 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17d70 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74  tion and frees t
17d80 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  he object itself
17d90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17da0 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
17db0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
17dc0 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
17dd0 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
17de0 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  xt;.  assert( p-
17df0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
17e00 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
17e10 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
17e20 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
17e30 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
17e40 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
17e50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
17e60 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
17e70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
17e80 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
17e90 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
17ea0 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
17eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
17ec0 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
17ed0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67    }.  if( p->mag
17ee0 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
17ef0 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  NIT ){.    relea
17f00 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
17f10 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
17f20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17f30 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a  db, p->pVList);.
17f40 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17f50 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
17f60 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f  .  }.  vdbeFreeO
17f70 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
17f80 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
17f90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17fa0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
17fb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17fc0 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64  , p->zSql);.#ifd
17fd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17fe0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
17ff0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
18000 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18010 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
18020 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
18030 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
18040 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
18050 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18060 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
18070 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
18080 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18090 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
180a0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
180b0 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
180c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
180d0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
180e0 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
180f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18100 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
18110 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
18120 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
18130 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
18140 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
18150 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
18160 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
18170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18180 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
18190 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
181a0 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
181b0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
181c0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
181d0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
181e0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
181f0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
18200 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
18210 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
18220 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  eeNN(db, p);.}..
18230 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
18240 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
18250 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
18260 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
18270 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
18280 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
18290 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
182a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
182b0 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
182c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
182d0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
182e0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
182f0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
18300 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
18310 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
18320 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
18330 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18340 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
18350 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
18360 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
18370 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
18380 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
18390 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
183a0 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
183b0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
183c0 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
183d0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
183e0 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
183f0 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
18400 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
18410 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
18420 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
18430 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
18440 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18450 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
18460 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
18470 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
18480 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
18490 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
184a0 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
184b0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
184c0 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
184d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
184e0 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
184f0 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
18500 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
18510 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
18520 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
18530 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
18540 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
18550 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
18560 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
18570 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
18580 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
18590 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
185a0 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
185b0 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
185c0 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
185d0 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
185e0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
185f0 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
18600 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
18610 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
18620 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
18630 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
18640 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
18650 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
18660 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
18670 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
18680 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
18690 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
186a0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
186b0 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
186c0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
186d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
186e0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
186f0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
18700 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18710 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
18720 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
18730 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
18740 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
18750 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
18760 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
18770 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
18780 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
18790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
187a0 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
187b0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
187c0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
187d0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
187e0 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
187f0 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
18800 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
18810 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
18820 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
18830 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
18840 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
18850 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
18860 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
18870 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( s
18880 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18890 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
188a0 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
188b0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
188c0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
188d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
188e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
188f0 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
18900 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
18910 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
18920 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
18930 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
18940 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
18950 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
18960 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
18970 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
18980 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
18990 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
189a0 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
189b0 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
189c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
189d0 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
189e0 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
189f0 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
18a00 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
18a10 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
18a20 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
18a30 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
18a40 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
18a50 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
18a60 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
18a70 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
18a80 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
18a90 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
18aa0 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
18ab0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
18ac0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
18ad0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
18ae0 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
18af0 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
18b00 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
18b10 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
18b20 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
18b30 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18b50 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
18b60 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
18b70 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
18b80 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
18b90 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
18ba0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
18bb0 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43  E_BTREE || p->eC
18bc0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
18bd0 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20  PSEUDO );.  if( 
18be0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
18bf0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61  o ){.    int iMa
18c00 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  p;.    if( p->aA
18c10 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d  ltMap && (iMap =
18c20 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70   p->aAltMap[1+*p
18c30 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20  iCol])>0 ){.    
18c40 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
18c50 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69  ursor;.      *pi
18c60 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
18c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18c80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18c90 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
18ca0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
18cb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
18cc0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
18cd0 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
18ce0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
18cf0 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
18d00 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
18d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
18d30 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
18d40 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
18d50 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
18d60 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
18d70 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
18d80 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
18d90 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
18da0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
18db0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
18dc0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
18dd0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
18de0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
18df0 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
18e00 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
18e10 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
18e20 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
18e30 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
18e40 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
18e50 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
18e60 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
18e70 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
18e80 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
18e90 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
18ea0 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
18eb0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
18ec0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
18ed0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
18ee0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
18ef0 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
18f00 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
18f10 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
18f20 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
18f30 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
18f40 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
18f50 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
18f60 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
18f70 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
18f80 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
18f90 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
18fa0 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
18fb0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
18fc0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
18fd0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
18fe0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
18ff0 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
19000 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
19010 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
19020 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
19030 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
19040 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
19050 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
19060 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
19070 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
19080 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
19090 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
190a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
190b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
190c0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
190e0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
190f0 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
19110 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
19120 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
19130 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
19140 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
19150 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19160 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
19190 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
191a0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
191b0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
191c0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
191d0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
191e0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
191f0 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
19200 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
19210 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
19240 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
19250 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
19260 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
19270 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
19280 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192a0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
192b0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
192c0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
192e0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
192f0 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
19300 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
19330 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
19340 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
19350 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
19360 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
19370 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
19380 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
19390 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
193a0 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
193b0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
193c0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
193d0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
193e0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
193f0 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
19400 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
19410 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
19420 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
19430 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
19440 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
19450 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
19460 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
19470 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
19480 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
19490 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
194a0 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
194b0 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
194c0 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
194d0 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
194e0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
194f0 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
19500 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
19510 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
19520 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
19530 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
19540 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
19550 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
19560 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
19570 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
19580 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
19590 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
195a0 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
195b0 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
195c0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
195d0 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
195e0 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
195f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19600 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
19610 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
19620 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
19630 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
19640 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
19650 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
19660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19670 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
19680 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
196a0 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
196b0 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
196c0 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
196d0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
196e0 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
196f0 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
19700 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
19710 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
19720 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
19730 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
19740 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
19750 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
19760 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
19770 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
19780 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
19790 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
197a0 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
197b0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
197c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
197d0 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
197e0 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
197f0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
19800 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
19810 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
19820 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
19830 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
19840 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
19850 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
19860 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
19870 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
19880 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
19890 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
198a0 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
198b0 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
198c0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
198d0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
198e0 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
198f0 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
19900 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
19910 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
19920 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
19930 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
19940 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
19950 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
19960 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
19970 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
19980 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
19990 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
199a0 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
199b0 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
199c0 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
199d0 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
199e0 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
199f0 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
19a00 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
19a10 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
19a20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
19a30 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
19a40 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
19a50 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
19a60 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
19a70 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
19a80 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
19a90 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
19aa0 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
19ab0 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
19ac0 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
19ad0 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
19ae0 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
19af0 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
19b00 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
19b10 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
19b20 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
19b30 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
19b40 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
19b50 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
19b60 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
19b70 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
19b80 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
19b90 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
19ba0 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
19bb0 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
19bc0 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
19bd0 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
19be0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
19bf0 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
19c00 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
19c10 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19c20 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
19c30 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
19c40 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
19c50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
19c60 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
19c70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
19c80 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
19c90 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
19ca0 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
19cb0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
19cc0 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
19cd0 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
19ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
19cf0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
19d00 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
19d10 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
19d20 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
19d30 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
19d40 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
19d50 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
19d60 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
19d70 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
19d80 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
19d90 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
19da0 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
19db0 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
19dc0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
19dd0 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
19de0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
19df0 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
19e00 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
19e10 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
19e20 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
19e30 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
19e40 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
19e50 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
19e60 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
19e70 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
19e80 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
19e90 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
19ea0 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
19eb0 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
19ec0 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
19ed0 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
19ee0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
19ef0 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
19f00 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
19f10 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
19f20 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
19f30 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
19f40 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
19f50 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
19f60 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
19f70 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
19f80 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
19f90 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
19fa0 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
19fb0 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
19fc0 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
19fd0 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
19fe0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
19ff0 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
1a000 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
1a010 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
1a020 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
1a030 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
1a040 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
1a050 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
1a060 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
1a070 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
1a080 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
1a090 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
1a0a0 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
1a0b0 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
1a0c0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
1a0d0 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
1a0e0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
1a0f0 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
1a100 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1a110 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
1a120 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1a130 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
1a140 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
1a150 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
1a160 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
1a170 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
1a180 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
1a190 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
1a1a0 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
1a1b0 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
1a1c0 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
1a1d0 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
1a1e0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
1a1f0 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
1a200 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
1a210 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
1a220 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
1a230 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
1a240 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
1a250 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
1a260 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
1a270 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
1a280 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
1a290 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
1a2a0 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
1a2b0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1a2c0 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
1a2d0 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
1a2e0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
1a2f0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
1a300 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
1a310 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
1a320 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
1a330 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
1a340 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
1a350 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
1a360 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
1a370 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
1a380 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
1a390 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
1a3a0 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
1a3b0 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
1a3c0 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
1a3d0 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
1a3e0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
1a3f0 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
1a400 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
1a410 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
1a420 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1a430 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1a440 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
1a450 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
1a460 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
1a470 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
1a480 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
1a490 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
1a4a0 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
1a4b0 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
1a4c0 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
1a4d0 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
1a4e0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
1a4f0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1a500 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
1a510 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
1a520 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
1a530 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
1a540 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1a550 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
1a560 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
1a570 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
1a580 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
1a590 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
1a5a0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1a5b0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
1a5c0 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
1a5d0 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
1a5e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a5f0 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
1a600 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
1a610 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
1a620 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
1a630 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
1a640 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
1a650 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
1a660 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
1a670 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
1a680 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
1a690 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
1a6a0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
1a6b0 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
1a6c0 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
1a6d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a6e0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1a6f0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
1a700 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
1a710 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
1a720 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
1a730 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
1a740 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
1a750 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
1a760 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
1a770 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
1a780 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
1a790 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
1a7a0 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
1a7b0 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
1a7c0 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
1a7d0 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
1a7e0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
1a7f0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1a800 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
1a810 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
1a820 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
1a830 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1a840 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
1a850 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
1a860 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1a870 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
1a880 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
1a890 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
1a8a0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1a8b0 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
1a8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
1a8d0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1a8e0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
1a8f0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1a900 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1a910 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
1a920 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
1a930 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
1a940 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
1a950 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
1a960 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
1a970 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1a980 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
1a990 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
1a9a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1a9b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a9c0 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
1a9d0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1a9e0 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
1a9f0 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
1aa00 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
1aa10 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1aa20 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
1aa30 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
1aa40 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
1aa50 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
1aa60 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
1aa70 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
1aa80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
1aa90 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
1aaa0 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
1aab0 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
1aac0 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
1aad0 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
1aae0 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
1aaf0 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
1ab00 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
1ab10 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
1ab20 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
1ab30 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
1ab40 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
1ab50 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
1ab60 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
1ab70 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
1ab80 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
1ab90 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
1aba0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
1abb0 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
1abc0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
1abd0 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
1abe0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1abf0 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
1ac00 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
1ac10 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1ac20 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
1ac30 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
1ac40 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
1ac50 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1ac60 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1ac70 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
1ac80 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
1ac90 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
1aca0 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
1acb0 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
1acc0 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
1acd0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
1ace0 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
1acf0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ad00 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
1ad10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ad20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1ad30 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
1ad40 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
1ad50 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
1ad60 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
1ad70 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
1ad80 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
1ad90 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
1ada0 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
1adb0 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
1adc0 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
1add0 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
1ade0 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
1adf0 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
1ae00 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
1ae10 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
1ae20 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1ae30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1ae40 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1ae50 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1ae60 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1ae70 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1ae80 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1ae90 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1aea0 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1aeb0 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1aec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1aed0 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1aee0 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1aef0 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
1af00 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
1af10 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
1af20 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
1af30 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
1af40 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
1af50 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
1af60 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1af70 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
1af80 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1af90 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
1afa0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1afb0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1afc0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
1afd0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
1afe0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1aff0 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
1b000 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1b010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1b020 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b030 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
1b040 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1b050 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
1b060 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
1b070 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
1b080 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
1b090 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
1b0a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b0b0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b0c0 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
1b0d0 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
1b0e0 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
1b0f0 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
1b100 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1b110 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
1b120 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
1b130 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1b140 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
1b150 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
1b160 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
1b170 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
1b180 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
1b190 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
1b1a0 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1b1b0 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
1b1c0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
1b1d0 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
1b1e0 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
1b1f0 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
1b200 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
1b210 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1b220 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
1b230 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
1b240 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
1b250 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1b260 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1b270 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1b280 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1b290 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1b2a0 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1b2b0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1b2c0 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1b2d0 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1b2e0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1b2f0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1b300 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1b310 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1b320 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1b330 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1b340 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1b350 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1b360 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b370 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1b380 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1b390 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1b3a0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b3c0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1b3d0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1b3e0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b400 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1b410 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1b420 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1b430 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1b440 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a     case 10: { /*
1b450 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   Internal use on
1b460 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69  ly: NULL with vi
1b470 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
1b480 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50             ** UP
1b490 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66  DATE no-change f
1b4a0 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  lag set */.     
1b4b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1b4c0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f  EM_Null|MEM_Zero
1b4d0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1b4e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  = 0;.      pMem-
1b4f0 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20  >u.nZero = 0;.  
1b500 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b510 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
1b520 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1b530 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1b540 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
1b550 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
1b560 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1b570 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
1b580 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
1b590 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1b5a0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
1b5b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b5c0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
1b5d0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1b5e0 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
1b5f0 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
1b600 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
1b610 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
1b620 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1b630 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
1b640 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1b650 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1b660 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1b670 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1b680 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1b690 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1b6a0 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1b6b0 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1b6c0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1b6d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b6e0 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
1b6f0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1b700 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
1b710 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1b720 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1b730 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1b740 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1b750 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1b760 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1b770 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1b780 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1b790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
1b7a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b7b0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1b7c0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1b7d0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1b7e0 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
1b7f0 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
1b800 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
1b810 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1b820 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1b830 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1b840 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
1b850 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1b860 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1b870 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1b880 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1b890 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1b8a0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
1b8b0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1b8c0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1b8d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1b8e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b8f0 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
1b900 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1b910 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
1b920 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1b930 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1b940 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1b950 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
1b960 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
1b970 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
1b980 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
1b990 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
1b9a0 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
1b9b0 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
1b9c0 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
1b9d0 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
1b9e0 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
1b9f0 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
1ba00 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
1ba10 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1ba20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ba30 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1ba40 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
1ba50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1ba60 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1ba70 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1ba80 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1ba90 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
1baa0 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
1bab0 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
1bac0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1bad0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1bae0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1baf0 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1bb00 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
1bb10 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1bb20 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1bb30 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1bb40 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1bb50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1bb60 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1bb70 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
1bb80 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
1bb90 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1bba0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1bbb0 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
1bbc0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
1bbd0 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
1bbe0 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
1bbf0 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
1bc00 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
1bc10 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
1bc20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
1bc30 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
1bc40 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
1bc50 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1bc60 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1bc70 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
1bc80 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
1bc90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bca0 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
1bcb0 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
1bcc0 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
1bcd0 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
1bce0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
1bcf0 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
1bd00 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
1bd10 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1bd20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
1bd30 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
1bd40 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
1bd50 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1bd60 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
1bd70 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
1bd80 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1bd90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1bda0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1bdb0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
1bdc0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
1bdd0 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
1bde0 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
1bdf0 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
1be00 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
1be10 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
1be20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
1be30 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
1be40 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
1be50 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1be60 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
1be70 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
1be80 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
1be90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
1bea0 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
1beb0 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
1bec0 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
1bed0 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
1bee0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
1bef0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
1bf00 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1bf10 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
1bf20 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
1bf30 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
1bf40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
1bf50 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
1bf60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
1bf70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bf80 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
1bf90 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
1bfa0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
1bfb0 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
1bfc0 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
1bfd0 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
1bfe0 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
1bff0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
1c000 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
1c010 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1c020 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
1c030 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
1c040 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
1c050 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
1c060 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
1c070 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1c080 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
1c090 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1c0a0 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1c0b0 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1c0c0 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1c0d0 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1c0e0 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1c0f0 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1c100 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1c110 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1c120 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1c130 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1c140 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1c150 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1c160 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1c170 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1c180 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1c190 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1c1a0 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1c1b0 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1c1c0 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1c1d0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1c1e0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1c1f0 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1c200 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1c210 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1c220 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1c230 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1c240 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1c250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1c260 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1c270 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  e record */.){. 
1c280 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c290 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1c2a0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1c2b0 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1c2c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c2f0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1c300 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65  or *p */.  nByte
1c310 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
1c320 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1c330 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
1c340 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  (pKeyInfo->nKeyF
1c350 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28  ield+1);.  p = (
1c360 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1c370 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1c380 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1c390 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1c3a0 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1c3b0 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
1c3c0 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
1c3d0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1c3e0 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
1c3f0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1c400 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1c410 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
1c420 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1c430 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
1c440 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b  nfo->nKeyField +
1c450 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1c460 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1c470 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1c480 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1c490 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1c4a0 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1c4b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1c4c0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1c4d0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1c4e0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1c4f0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1c500 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1c510 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1c520 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1c530 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1c540 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1c550 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1c560 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1c570 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1c580 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1c590 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c5a0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1c5b0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1c5c0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1c5d0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1c5e0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1c5f0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1c600 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1c610 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1c620 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1c630 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c640 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1c650 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c660 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1c670 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1c6a0 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1c6b0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1c6c0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c6e0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c6f0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1c700 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1c710 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1c720 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1c730 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1c740 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1c750 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1c760 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1c770 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1c780 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1c790 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1c7a0 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1c7b0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1c7c0 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1c7d0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1c7e0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1c7f0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1c800 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1c810 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1c820 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1c830 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1c840 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1c850 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1c860 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1c870 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1c880 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1c890 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d  oc = 0;.    pMem
1c8a0 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  ->z = 0;.    d +
1c8b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1c8c0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1c8d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1c8e0 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1c8f0 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1c900 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1c910 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
1c920 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b   u<=pKeyInfo->nK
1c930 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  eyField + 1 );. 
1c940 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1c950 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1c960 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
1c970 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1c980 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
1c990 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
1c9a0 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
1c9b0 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
1c9c0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c9d0 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
1c9e0 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
1c9f0 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
1ca00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
1ca10 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
1ca20 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
1ca30 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
1ca40 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1ca50 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
1ca60 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
1ca70 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
1ca80 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
1ca90 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
1caa0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
1cab0 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
1cac0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
1cad0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
1cae0 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
1caf0 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
1cb00 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  mitives..**.** R
1cb10 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1cb20 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1cb30 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61  arison is equiva
1cb40 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52  lent to desiredR
1cb50 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  esult..** Return
1cb60 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20   false if there 
1cb70 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e  is a disagreemen
1cb80 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1cb90 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1cba0 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e  reDebug(.  int n
1cbb0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1cbc0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1cbd0 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1cbe0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1cbf0 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74  pPKey2, /* Right
1cc00 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65   key */.  int de
1cc10 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20  siredResult     
1cc20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65          /* Corre
1cc30 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a  ct answer */.){.
1cc40 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1cc50 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1cc60 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1cc70 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1cc80 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1cc90 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1cca0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1ccb0 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
1ccc0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
1ccd0 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
1cce0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1ccf0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1cd00 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1cd10 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
1cd20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1cd30 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1cd40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1cd50 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
1cd60 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
1cd70 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
1cd80 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1cd90 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79  Info;.  if( pKey
1cda0 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65  Info->db==0 ) re
1cdb0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65  turn 1;.  mem1.e
1cdc0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1cdd0 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
1cde0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1cdf0 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
1ce00 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
1ce10 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
1ce20 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1ce30 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
1ce40 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1ce50 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1ce60 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1ce70 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1ce80 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
1ce90 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
1cea0 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
1ceb0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
1cec0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
1ced0 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
1cee0 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
1cef0 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
1cf00 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
1cf10 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
1cf20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
1cf30 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
1cf40 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
1cf50 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
1cf60 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
1cf70 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
1cf80 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
1cf90 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
1cfa0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
1cfb0 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
1cfc0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1cfd0 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
1cfe0 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
1cff0 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
1d000 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
1d010 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
1d020 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
1d030 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
1d040 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
1d050 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
1d060 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
1d070 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
1d080 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
1d090 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
1d0a0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1d0b0 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20   szHdr1);.  if( 
1d0c0 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72  szHdr1>98307 ) r
1d0d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d0e0 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48  RUPT;.  d1 = szH
1d0f0 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
1d100 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1d110 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1d120 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
1d130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1d140 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1d150 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1d160 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  t( pKeyInfo->nKe
1d170 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  yField>0 );.  as
1d180 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
1d190 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
1d1a0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
1d1b0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
1d1c0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1d1d0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
1d1e0 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
1d1f0 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
1d200 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
1d210 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
1d220 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
1d230 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ype1 );..    /* 
1d240 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72  Verify that ther
1d250 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20  e is enough key 
1d260 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20  space remaining 
1d270 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20  to avoid.    ** 
1d280 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  a buffer overrea
1d290 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69  d.  The "d1+seri
1d2a0 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65  al_type1+2" sube
1d2b0 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20  xpression will. 
1d2c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
1d2d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1d2e0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f  equal to the amo
1d2f0 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20  unt of required 
1d300 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  key space..    *
1d310 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f  * Use that appro
1d320 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69  ximation to avoi
1d330 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e  d the more expen
1d340 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20  sive call to.   
1d350 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53   ** sqlite3VdbeS
1d360 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69  erialTypeLen() i
1d370 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1d380 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d390 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65  ( d1+serial_type
1d3a0 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20  1+2>(u32)nKey1. 
1d3b0 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65      && d1+sqlite
1d3c0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1d3d0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
1d3e0 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20  >(u32)nKey1 .   
1d3f0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1d400 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
1d410 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1d420 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
1d430 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
1d440 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1d450 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1d460 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
1d470 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
1d480 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
1d490 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
1d4a0 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
1d4b0 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
1d4c0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70  Key2->aMem[i], p
1d4d0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1d4e0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
1d4f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1d500 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1d510 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1d520 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1d530 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1d540 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1d550 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1d560 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
1d570 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
1d580 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
1d590 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
1d5a0 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d     goto debugCom
1d5b0 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20  pareEnd;.    }. 
1d5c0 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65     i++;.  }while
1d5d0 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
1d5e0 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1d5f0 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  d );..  /* No me
1d600 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1d610 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1d620 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1d630 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1d640 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1d650 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1d660 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1d670 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1d680 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1d690 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1d6a0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1d6b0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
1d6c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1d6d0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1d6e0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1d6f0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1d700 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1d710 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1d720 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1d730 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1d740 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1d750 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
1d760 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
1d770 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  alue.  */.  rc =
1d780 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1d790 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61  _rc;..debugCompa
1d7a0 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73  reEnd:.  if( des
1d7b0 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26  iredResult==0 &&
1d7c0 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   rc==0 ) return 
1d7d0 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1d7e0 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30  Result<0 && rc<0
1d7f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1d800 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1d810 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74  >0 && rc>0 ) ret
1d820 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52  urn 1;.  if( COR
1d830 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1d840 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   1;.  if( pKeyIn
1d850 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1d860 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1d870 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1d880 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1d890 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1d8a0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1d8b0 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b  r of fields (a.k
1d8c0 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20  .a. columns) in 
1d8d0 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
1d8e0 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79   by.** pKey,nKey
1d8f0 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68  .  The verify th
1d900 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73  at this count is
1d910 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1d920 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69  ual to the.** li
1d930 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65  mit given by pKe
1d940 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1d950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1d960 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1d970 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1d980 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1d990 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1d9a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1d9b0 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1d9c0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1d9d0 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1d9e0 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1d9f0 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1da00 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1da10 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1da20 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1da30 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46  he KeyInfo.nKeyF
1da40 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1da50 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73  nAllField values
1da60 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1da70 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1da80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1da90 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1daa0 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1dab0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1dac0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1dad0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1dae0 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1daf0 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1db00 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1db10 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1db20 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1db30 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1db40 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1db50 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1db60 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1db70 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1db80 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1db90 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1dba0 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1dbb0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1dbc0 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1dbd0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1dbe0 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1dbf0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1dc00 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1dc10 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1dc20 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1dc30 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1dc40 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1dc50 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1dc60 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1dc70 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1dc80 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1dc90 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ld );.}.#else.# 
1dca0 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72  define vdbeAsser
1dcb0 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1dcc0 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23  nLimits(A,B,C).#
1dcd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  endif../*.** Bot
1dce0 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d  h *pMem1 and *pM
1dcf0 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69  em2 contain stri
1dd00 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61  ng values. Compa
1dd10 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
1dd20 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63  s.** using the c
1dd30 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1dd40 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61  e pColl. As usua
1dd50 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61  l, return a nega
1dd60 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  tive , zero.** o
1dd70 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  r positive value
1dd80 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65   if *pMem1 is le
1dd90 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1dda0 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  o or greater tha
1ddb0 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65  n .** *pMem2, re
1ddc0 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69  spectively. Simi
1ddd0 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f  lar in spirit to
1dde0 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20   "rc = (*pMem1) 
1ddf0 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f  - (*pMem2);"..*/
1de00 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1de10 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1de20 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  (.  const Mem *p
1de30 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65  Mem1,.  const Me
1de40 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73  m *pMem2,.  cons
1de50 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1de60 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20  ,.  u8 *prcErr  
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d      /* If an OOM
1de90 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20   occurs, set to 
1dea0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a  SQLITE_NOMEM */.
1deb0 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
1dec0 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
1ded0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
1dee0 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
1def0 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
1df00 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
1df10 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
1df20 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1df30 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
1df40 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
1df50 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1df60 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
1df70 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
1df80 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
1df90 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1dfa0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
1dfb0 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b  *v2;.    Mem c1;
1dfc0 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
1dfd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1dfe0 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e  nit(&c1, pMem1->
1dff0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1e000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e010 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31  mInit(&c2, pMem1
1e020 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1e030 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e040 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1e050 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45  c1, pMem1, MEM_E
1e060 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  phem);.    sqlit
1e070 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1e080 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c  Copy(&c2, pMem2,
1e090 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1e0a0 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v1 = sqlite3Val
1e0b0 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1e0c0 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c  value*)&c1, pCol
1e0d0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20  l->enc);.    v2 
1e0e0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1e0f0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1e100 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
1e110 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  nc);.    if( (v1
1e120 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b  ==0 || v2==0) ){
1e130 0a 20 20 20 20 20 20 69 66 28 20 70 72 63 45 72  .      if( prcEr
1e140 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51  r ) *prcErr = SQ
1e150 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1e160 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
1e170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e180 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1e190 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63  (pColl->pUser, c
1e1a0 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76  1.n, v1, c2.n, v
1e1b0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
1e1c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e1d0 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1e1e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e1f0 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
1e200 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1e210 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
1e220 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74  pBlob is guarant
1e230 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62  eed to be a Blob
1e240 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72   that is not mar
1e250 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f  ked.** with MEM_
1e260 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72  Zero.  Return tr
1e270 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62  ue if it could b
1e280 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a  e a zero-blob..*
1e290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
1e2a0 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61  llZero(const cha
1e2b0 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
1e2c0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1e2d0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1e2e0 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75   if( z[i] ) retu
1e2f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1e300 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1e310 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1e320 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1e330 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1e340 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1e350 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1e360 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1e370 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1e380 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1e390 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1e3a0 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1e3b0 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1e3c0 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1e3d0 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1e3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1e3f0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73  E_NOINLINE int s
1e400 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1e410 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31  e(const Mem *pB1
1e420 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32  , const Mem *pB2
1e430 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1e440 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20  t n1 = pB1->n;. 
1e450 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e   int n2 = pB2->n
1e460 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f  ;..  /* It is po
1e470 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61  ssible to have a
1e480 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74   Blob value that
1e490 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65   has some non-ze
1e4a0 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  ro content.  ** 
1e4b0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f  followed by zero
1e4c0 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74   content.  But t
1e4d0 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75  hat only comes u
1e4e0 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d  p for Blobs form
1e4f0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f  ed.  ** by the O
1e500 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1e510 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c  ode, and such Bl
1e520 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61  obs never get pa
1e530 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
1e540 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1e550 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
1e560 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB1->flags & M
1e570 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1e580 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1==0 );.  assert
1e590 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20  ( (pB2->flags & 
1e5a0 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
1e5b0 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  n2==0 );..  if( 
1e5c0 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d  (pB1->flags|pB2-
1e5d0 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65  >flags) & MEM_Ze
1e5e0 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  ro ){.    if( pB
1e5f0 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e  1->flags & pB2->
1e600 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1e610 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e620 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1e630 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1e640 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d    }else if( pB1-
1e650 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1e660 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  o ){.      if( !
1e670 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a  isAllZero(pB2->z
1e680 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75  , pB2->n) ) retu
1e690 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74  rn -1;.      ret
1e6a0 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1e6b0 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65   - n2;.    }else
1e6c0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1e6d0 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70  llZero(pB1->z, p
1e6e0 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B1->n) ) return 
1e6f0 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1e700 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65   n1 - pB2->u.nZe
1e710 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ro;.    }.  }.  
1e720 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
1e730 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32  z, pB2->z, n1>n2
1e740 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69   ? n2 : n1);.  i
1e750 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1e760 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e  .  return n1 - n
1e770 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  2;.}../*.** Do a
1e780 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
1e790 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67  een a 64-bit sig
1e7a0 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
1e7b0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  a 64-bit floatin
1e7c0 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g-point.** numbe
1e7d0 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  r.  Return negat
1e7e0 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1e7f0 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1e800 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73  rst (i64) is les
1e810 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c  s than,.** equal
1e820 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1e830 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  than the second 
1e840 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  (double)..*/.sta
1e850 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
1e860 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69  ntFloatCompare(i
1e870 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b  64 i, double r){
1e880 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f  .  if( sizeof(LO
1e890 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38  NGDOUBLE_TYPE)>8
1e8a0 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42   ){.    LONGDOUB
1e8b0 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e  LE_TYPE x = (LON
1e8c0 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a  GDOUBLE_TYPE)i;.
1e8d0 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65      if( x<r ) re
1e8e0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1e8f0 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   x>r ) return +1
1e900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1e910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
1e920 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73   y;.    double s
1e930 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32  ;.    if( r<-922
1e940 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
1e950 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .0 ) return +1;.
1e960 20 20 20 20 69 66 28 20 72 3e 3d 39 32 32 33 33      if( r>=92233
1e970 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30  72036854775808.0
1e980 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1e990 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20    y = (i64)r;.  
1e9a0 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75    if( i<y ) retu
1e9b0 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  rn -1;.    if( i
1e9c0 3e 79 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >y ) return +1;.
1e9d0 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29      s = (double)
1e9e0 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29  i;.    if( s<r )
1e9f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1ea00 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e  if( s>r ) return
1ea10 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1ea20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1ea30 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
1ea40 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
1ea50 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
1ea60 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
1ea70 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
1ea80 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
1ea90 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
1eaa0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1eab0 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
1eac0 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
1ead0 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
1eae0 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
1eaf0 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
1eb00 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
1eb10 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
1eb20 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
1eb30 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
1eb40 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
1eb50 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
1eb60 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
1eb70 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
1eb80 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
1eb90 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
1eba0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1ebb0 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
1ebc0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1ebd0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1ebe0 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
1ebf0 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
1ec00 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
1ec10 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
1ec20 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
1ec30 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
1ec40 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
1ec50 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
1ec60 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
1ec70 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
1ec80 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
1ec90 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20  (combined_flags 
1eca0 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
1ecb0 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
1ecc0 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
1ecd0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1ece0 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
1ecf0 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
1ed00 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
1ed10 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
1ed20 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1ed30 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
1ed40 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
1ed50 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
1ed60 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  l);.  }..  /* At
1ed70 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
1ed80 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20  e two values is 
1ed90 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20  a number.  */.  
1eda0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1edb0 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
1edc0 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  Real) ){.    if(
1edd0 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
1ede0 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1edf0 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1ee00 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  < pMem2->u.i ) r
1ee10 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1ee20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e  if( pMem1->u.i >
1ee30 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1ee40 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1ee50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1ee60 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1ee70 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  & MEM_Real)!=0 )
1ee80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1ee90 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.r < pMem2->
1eea0 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.r ) return -1;
1eeb0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1eec0 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.r > pMem2->u
1eed0 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .r ) return +1;.
1eee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1eef0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1ef00 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  1&MEM_Int)!=0 ){
1ef10 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1ef20 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1ef30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
1ef40 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1ef50 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c  pare(pMem1->u.i,
1ef60 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20   pMem2->u.r);.  
1ef70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ef80 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1ef90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1efa0 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
1efb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1efc0 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f2&MEM_Int)!=
1efd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1efe0 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  urn -sqlite3IntF
1eff0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1f000 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75  2->u.i, pMem1->u
1f010 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1f020 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1f030 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1f040 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31   }.    return +1
1f050 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
1f060 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  ne value is a st
1f070 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68  ring and the oth
1f080 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68  er is a blob, th
1f090 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73  e string is less
1f0a0 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
1f0b0 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70  re strings, comp
1f0c0 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f  are using the co
1f0d0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
1f0e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  s..  */.  if( co
1f0f0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1f100 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20  _Str ){.    if( 
1f110 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f1 & MEM_Str)==
1f120 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1f130 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
1f140 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72  f( (f2 & MEM_Str
1f150 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1f160 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
1f170 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1f180 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65  1->enc==pMem2->e
1f190 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d  nc || pMem1->db-
1f1a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1f1b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1f1c0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1f1d0 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20  UTF8 || .       
1f1e0 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d       pMem1->enc=
1f1f0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
1f200 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  || pMem1->enc==S
1f210 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
1f220 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ..    /* The col
1f230 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1f240 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20  must be defined 
1f250 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65  at this point, e
1f260 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ven if.    ** th
1f270 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74  e user deletes t
1f280 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1f290 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20  uence after the 
1f2a0 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a  vdbe program is.
1f2b0 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
1f2c0 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c  (this was not al
1f2d0 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a  ways the case)..
1f2e0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1f2f0 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f  t( !pColl || pCo
1f300 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20  ll->xCmp );..   
1f310 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1f320 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
1f330 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1f340 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43  pMem1, pMem2, pC
1f350 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  oll, 0);.    }. 
1f360 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
1f370 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
1f380 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
1f390 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
1f3a0 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
1f3b0 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
1f3c0 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
1f3d0 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
1f3e0 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
1f3f0 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
1f400 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
1f410 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75  mp().  */.  retu
1f420 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  rn sqlite3BlobCo
1f430 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65  mpare(pMem1, pMe
1f440 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  m2);.}.../*.** T
1f450 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1f460 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1f470 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
1f480 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a  erial-type that.
1f490 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ** corresponds t
1f4a0 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61  o an integer - a
1f4b0 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  ll values betwee
1f4c0 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73  n 1 and 9 inclus
1f4d0 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37  ive .** except 7
1f4e0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69  . The second poi
1f4f0 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
1f500 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e  containing an in
1f510 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73  teger value.** s
1f520 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64  erialized accord
1f530 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79  ing to serial_ty
1f540 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  pe. This functio
1f550 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a  n deserializes.*
1f560 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  * and returns th
1f570 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  e value..*/.stat
1f580 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72  ic i64 vdbeRecor
1f590 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73  dDecodeInt(u32 s
1f5a0 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73  erial_type, cons
1f5b0 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
1f5c0 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20  32 y;.  assert( 
1f5d0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73  CORRUPT_DB || (s
1f5e0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26  erial_type>=1 &&
1f5f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20   serial_type<=9 
1f600 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  && serial_type!=
1f610 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  7) );.  switch( 
1f620 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1f630 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63     case 0:.    c
1f640 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73  ase 1:.      tes
1f650 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1f660 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1f670 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  urn ONE_BYTE_INT
1f680 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1f690 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   2:.      testca
1f6a0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1f6b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1f6c0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1f6d0 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a  ey);.    case 3:
1f6e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f6f0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1f700 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48  .      return TH
1f710 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1f720 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20  y);.    case 4: 
1f730 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f740 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1f750 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
1f760 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1f770 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
1f780 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1f790 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1f7a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f7b0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1f7c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f7d0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1f7e0 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1f7f0 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1f800 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1f810 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a  }.    case 6: {.
1f820 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f        u64 x = FO
1f830 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f840 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f850 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1f860 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78   );.      x = (x
1f870 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1f880 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1f890 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1f8a0 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  4)*(i64*)&x;.   
1f8b0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1f8c0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1f8d0 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  8);.}../*.** Thi
1f8e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1f8f0 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
1f900 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
1f910 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
1f920 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
1f930 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
1f940 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
1f950 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
1f960 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
1f970 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
1f980 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1f990 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
1f9a0 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
1f9b0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
1f9c0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
1f9d0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
1f9e0 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
1f9f0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
1fa00 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
1fa10 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
1fa20 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
1fa30 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
1fa40 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
1fa50 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
1fa60 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  rd..**.** If arg
1fa70 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e  ument bSkip is n
1fa80 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  on-zero, it is a
1fa90 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1faa0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1fab0 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  dy.** determined
1fac0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1fad0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65  fields of the ke
1fae0 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a  ys are equal..**
1faf0 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
1fb00 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
1fb10 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
1fb20 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1fb30 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66  ds. If all .** f
1fb40 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61  ields that appea
1fb50 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61  r in both keys a
1fb60 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70  re equal, then p
1fb70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1fb80 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  c is .** returne
1fb90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  d..**.** If data
1fba0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1fbb0 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73  is discovered, s
1fbc0 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  et pPKey2->errCo
1fbd0 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45  de to .** SQLITE
1fbe0 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74  _CORRUPT and ret
1fbf0 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d  urn 0. If an OOM
1fc00 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1fc10 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79  tered, .** pPKey
1fc20 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65  2->errCode is se
1fc30 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1fc40 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20  M and, if it is 
1fc50 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a  not NULL, the.**
1fc60 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
1fc70 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62  lag set on datab
1fc80 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65  ase handle (pPKe
1fc90 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
1fca0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1fcb0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1fcc0 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e  reWithSkip(.  in
1fcd0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1fce0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1fcf0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1fd00 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1fd10 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f  PKey2,         /
1fd20 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1fd30 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20   int bSkip      
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69   /* If true, ski
1fd60 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  p the first fiel
1fd70 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  d */.){.  u32 d1
1fd80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fd90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1fda0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1fdb0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1fdc0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ment */.  int i;
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1fdf0 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64  ex of next field
1fe00 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
1fe10 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f   /* Size of reco
1fe40 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  rd header in byt
1fe50 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  es */.  u32 idx1
1fe60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fe70 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1fe80 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20  t of first type 
1fe90 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1fea0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fec0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1fed0 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20  /.  Mem *pRhs = 
1fee0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20  pPKey2->aMem;   
1fef0 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c      /* Next fiel
1ff00 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63  d of pPKey2 to c
1ff10 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49  ompare */.  KeyI
1ff20 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1ff30 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1ff40 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1ff50 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1ff60 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1ff70 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1ff80 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
1ff90 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
1ffa0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
1ffb0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
1ffc0 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1ffd0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
1ffe0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1fff0 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
20000 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
20010 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
20020 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
20030 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
20040 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
20050 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
20060 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
20070 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
20080 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
20090 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
200a0 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
200b0 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
200c0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
200d0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
200e0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
200f0 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
20100 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
20110 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
20120 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
20130 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
20140 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66  = szHdr1;.    if
20150 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e  ( d1>(unsigned)n
20160 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70  Key1 ){ .      p
20170 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
20180 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
20190 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
201a0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
201b0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
201c0 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  }.    i = 0;.  }
201d0 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
201e0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
201f0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
20200 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
20210 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73  atements */.  as
20220 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
20230 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
20240 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
20250 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
20260 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
20270 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
20280 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
20290 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
202a0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
202b0 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20  fo->nKeyField>0 
202c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
202d0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
202e0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
202f0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
20300 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
20310 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
20320 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
20330 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
20340 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
20350 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
20360 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
20370 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
20380 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
20390 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
203a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
203b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
203c0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
203d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
203e0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
203f0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
20400 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
20410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
20420 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
20430 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
20440 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
20450 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e   rc = -sqlite3In
20460 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52  tFloatCompare(pR
20470 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e  hs->u.i, mem1.u.
20480 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
20490 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
204a0 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
204b0 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
204c0 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
204d0 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
204e0 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
204f0 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
20500 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
20510 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
20520 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
20530 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
20540 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
20550 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
20560 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
20570 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
20580 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
20590 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
205a0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
205b0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
205c0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
205d0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
205e0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
205f0 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65  pes 12 or greate
20600 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e  r are strings an
20610 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72  d blobs (greater
20620 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a   than.        **
20630 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73   numbers). Types
20640 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63   10 and 11 are c
20650 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76  urrently "reserv
20660 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20  ed for future . 
20670 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20         ** use", 
20680 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65  so it doesn't re
20690 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74  ally matter what
206a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
206b0 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20  comparing.      
206c0 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d    ** them to num
206d0 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65  beric values are
206e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
206f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
20700 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
20710 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
20720 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
20730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
20740 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
20750 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
20760 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
20770 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
20780 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
20790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
207a0 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e   mem1.u.r<pRhs->
207b0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
207c0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
207d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
207e0 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75  mem1.u.r>pRhs->u
207f0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
20800 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
20810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20820 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20830 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46  rc = sqlite3IntF
20840 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31  loatCompare(mem1
20850 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29  .u.i, pRhs->u.r)
20860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20870 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20880 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
20890 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
208a0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
208b0 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
208c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
208d0 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
208e0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
208f0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
20900 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
20910 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
20920 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
20930 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
20940 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
20950 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
20960 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
20970 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
20980 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
20990 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
209a0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
209b0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
209c0 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
209d0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
209e0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
209f0 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
20a00 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
20a10 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
20a20 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
20a30 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
20a40 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
20a50 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
20a60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20a70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
20a80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
20a90 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
20aa0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
20ab0 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
20ac0 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
20ad0 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
20ae0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
20af0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
20b00 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
20b10 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
20b20 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
20b30 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
20b40 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
20b50 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
20b60 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
20b70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
20b80 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
20b90 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
20ba0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
20bb0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
20bc0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20be0 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
20bf0 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
20c00 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
20c10 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
20c20 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
20c30 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
20c40 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
20c50 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
20c60 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
20c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20c80 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
20c90 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
20ca0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
20cb0 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
20cc0 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73     assert( (pRhs
20cd0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
20ce0 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  ro)==0 || pRhs->
20cf0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65  n==0 );.      ge
20d00 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20d10 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
20d20 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
20d30 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
20d40 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
20d50 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
20d60 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
20d70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
20d80 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
20d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20da0 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
20db0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
20dc0 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
20dd0 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20de0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
20df0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
20e00 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20e10 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
20e20 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
20e30 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
20e40 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
20e60 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
20e70 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
20e80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
20e90 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
20ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
20eb0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
20ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
20ed0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
20ee0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
20ef0 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
20f00 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61  ((const char*)&a
20f10 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29  Key1[d1],nStr) )
20f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20f30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
20f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20f50 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70     rc = nStr - p
20f60 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rhs->u.nZero;.  
20f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20f90 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
20fa0 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
20fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20fc0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
20fd0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
20fe0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
20ff0 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
21000 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
21010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
21030 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
21040 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
21050 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
21060 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
21070 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
21080 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
21090 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
210a0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
210b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
210c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
210d0 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
210e0 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
210f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
21100 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
21110 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
21120 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
21130 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
21140 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
21150 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
21160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
21170 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
21180 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
21190 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
211a0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
211b0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
211c0 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
211d0 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
211e0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
211f0 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
21200 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
21210 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
21220 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
21230 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
21240 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
21250 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
21260 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
21270 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
21280 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
21290 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
212a0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
212b0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
212c0 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
212d0 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
212e0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
212f0 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
21300 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
21310 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
21320 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
21330 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
21340 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
21350 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
21360 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
21370 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
21380 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
21390 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
213a0 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
213b0 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
213c0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
213d0 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
213e0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
213f0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
21400 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
21410 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
21420 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66        || pKeyInf
21430 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
21440 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79  led.  );.  pPKey
21450 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
21460 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
21470 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e  default_rc;.}.in
21480 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
21490 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
214a0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
214b0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
214c0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
214d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
214e0 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f  PKey2          /
214f0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
21500 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
21510 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21520 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
21530 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21540 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
21550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21560 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
21570 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
21580 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21590 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
215a0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
215b0 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e   of pPKey2 is an
215c0 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62   integer, and (b
215d0 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f  ) the .** size-o
215e0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
215f0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21600 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
21610 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ts in a single.*
21620 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  * byte (i.e. is 
21630 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a  less than 128)..
21640 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63  **.** To avoid c
21650 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75  oncerns about bu
21660 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20  ffer overreads, 
21670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21680 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20  only used.** on 
21690 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68  schemas where th
216a0 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20  e maximum valid 
216b0 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36  header size is 6
216c0 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e  3 bytes or less.
216d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
216e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
216f0 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  Int(.  int nKey1
21700 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
21710 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
21720 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
21730 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
21740 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
21750 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
21760 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
21770 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
21780 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
21790 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
217a0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
217b0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
217c0 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
217d0 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
217e0 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20  .  i64 v;.  i64 
217f0 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65  lhs;..  vdbeAsse
21800 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
21810 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
21820 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
21830 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  KeyInfo);.  asse
21840 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
21850 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
21860 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
21870 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
21880 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
21890 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
218a0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
218b0 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
218c0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
218d0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
218e0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
218f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21900 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
21910 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
21920 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
21930 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
21940 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21950 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
21960 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21970 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
21980 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
21990 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
219a0 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
219b0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
219c0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
219d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
219e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
219f0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
21a00 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
21a10 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
21a20 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
21a30 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
21a40 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
21a50 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
21a60 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
21a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21a80 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
21a90 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
21aa0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
21ab0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
21ac0 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
21ad0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
21ae0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
21af0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
21b00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
21b10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
21b20 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
21b30 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
21b40 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
21b50 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
21b60 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
21b70 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
21b80 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
21b90 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
21ba0 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
21bb0 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
21bc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21bd0 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
21be0 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
21bf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
21c00 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
21c10 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
21c20 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
21c30 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
21c40 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
21c50 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
21c60 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
21c70 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
21c80 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
21c90 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
21ca0 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
21cb0 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
21cc0 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
21cd0 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
21ce0 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
21cf0 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
21d00 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
21d10 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
21d20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
21d30 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
21d40 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
21d50 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
21d60 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
21d70 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
21d80 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
21d90 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
21da0 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
21db0 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
21dc0 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
21dd0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21de0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21df0 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
21e00 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
21e10 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
21e20 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
21e30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
21e40 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21e50 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70  2);.  }..  v = p
21e60 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
21e70 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20  .i;.  if( v>lhs 
21e80 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
21e90 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
21ea0 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
21eb0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21ec0 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
21ed0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
21ee0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
21ef0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
21f00 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
21f10 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
21f20 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
21f30 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
21f40 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
21f50 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
21f60 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
21f70 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
21f80 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
21f90 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
21fa0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
21fb0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
21fc0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
21fd0 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
21fe0 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
21ff0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
22000 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
22010 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
22020 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
22030 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71  ;.    pPKey2->eq
22040 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Seen = 1;.  }.. 
22050 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
22060 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
22070 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
22080 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
22090 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
220a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
220b0 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
220c0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
220d0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
220e0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
220f0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
22100 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
22110 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
22120 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
22130 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
22140 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22150 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
22160 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
22170 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
22180 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
22190 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
221a0 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
221b0 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
221c0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
221d0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
221e0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
221f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
22200 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
22210 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22220 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
22230 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
22240 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
22250 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
22260 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
22270 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
22280 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
22290 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  rt( pPKey2->aMem
222a0 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [0].flags & MEM_
222b0 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73  Str );.  vdbeAss
222c0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
222d0 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
222e0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
222f0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74  pKeyInfo);.  get
22300 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
22310 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
22320 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
22330 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
22340 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
22350 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
22360 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
22370 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
22380 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
22390 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
223a0 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
223b0 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
223c0 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
223d0 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
223e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
223f0 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
22400 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
22410 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
22420 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
22430 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
22440 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
22450 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
22460 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
22470 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
22480 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22490 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
224a0 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69  ;    /* Corrupti
224b0 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
224c0 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65  nCmp = MIN( pPKe
224d0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e  y2->aMem[0].n, n
224e0 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  Str );.    res =
224f0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73   memcmp(&aKey1[s
22500 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61  zHdr], pPKey2->a
22510 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b  Mem[0].z, nCmp);
22520 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ..    if( res==0
22530 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
22540 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
22550 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
22560 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
22570 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
22580 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
22590 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
225a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
225b0 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
225c0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
225d0 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
225e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
225f0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22600 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
22610 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71        pPKey2->eq
22620 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
22630 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
22640 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
22650 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
22660 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
22670 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
22680 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
22690 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
226a0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
226b0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
226c0 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
226d0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
226e0 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
226f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
22700 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
22710 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
22720 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
22730 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
22740 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
22750 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
22760 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22770 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
22780 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
22790 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
227a0 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
227b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
227c0 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
227d0 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
227e0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
227f0 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
22800 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
22810 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
22820 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
22830 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
22840 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
22850 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
22860 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22870 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
22880 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
22890 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
228a0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
228b0 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
228c0 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
228d0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
228e0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
228f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
22900 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
22910 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
22920 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
22930 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
22940 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
22950 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
22960 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
22970 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
22980 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
22990 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
229a0 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
229b0 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
229c0 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
229d0 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
229e0 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
229f0 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
22a00 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
22a10 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
22a20 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
22a30 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
22a40 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
22a50 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
22a60 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
22a70 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
22a80 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
22a90 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
22aa0 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
22ab0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
22ac0 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
22ad0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
22ae0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
22af0 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
22b00 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
22b10 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
22b20 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
22b30 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
22b40 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
22b50 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
22b60 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
22b70 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
22b80 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
22b90 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
22ba0 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
22bb0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  p->pKeyInfo->nAl
22bc0 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20  lField<=13 ){.  
22bd0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
22be0 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
22bf0 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
22c00 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
22c10 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
22c20 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
22c30 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
22c40 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
22c50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
22c60 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
22c70 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
22c80 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
22c90 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
22ca0 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
22cb0 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
22cc0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
22cd0 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
22ce0 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
22cf0 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
22d00 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
22d10 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
22d20 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
22d30 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
22d40 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
22d50 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
22d60 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
22d70 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
22d80 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
22d90 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
22da0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
22db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
22dc0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
22dd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
22de0 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
22df0 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
22e00 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
22e10 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
22e20 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
22e30 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
22e40 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
22e50 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
22e60 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
22e70 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
22e80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
22e90 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
22ea0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
22eb0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
22ec0 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
22ed0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
22ee0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
22ef0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
22f00 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
22f10 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
22f20 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
22f30 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
22f40 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
22f50 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
22f60 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
22f70 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
22f80 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
22f90 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
22fa0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
22fb0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
22fc0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
22fd0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
22fe0 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
22ff0 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
23000 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
23010 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
23020 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
23030 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
23040 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
23050 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
23060 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
23070 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
23080 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
23090 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
230a0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
230b0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
230c0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
230d0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
230e0 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
230f0 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
23100 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
23110 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
23120 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
23130 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
23140 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
23150 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
23160 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
23170 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
23180 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
23190 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
231a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
231b0 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
231c0 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
231d0 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
231e0 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
231f0 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
23200 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
23210 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
23220 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
23230 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
23240 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
23250 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
23260 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
23270 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
23280 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20  nCellKey, &m);. 
23290 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
232a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
232b0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
232c0 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
232d0 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
232e0 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
232f0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
23300 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
23310 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
23320 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
23330 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
23340 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
23350 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
23360 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
23370 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
23380 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
23390 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
233a0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
233b0 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
233c0 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
233d0 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
233e0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
233f0 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
23400 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
23410 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
23420 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
23430 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
23440 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
23450 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
23460 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
23470 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
23480 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
23490 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
234a0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
234b0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
234c0 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
234d0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
234e0 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
234f0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
23500 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
23510 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
23520 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
23530 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
23540 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
23550 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
23560 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
23570 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
23580 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
23590 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
235a0 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
235b0 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
235c0 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
235d0 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
235e0 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
235f0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
23600 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
23610 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
23620 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
23630 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
23640 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
23650 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
23660 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
23670 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
23680 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
23690 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
236a0 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
236b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
236c0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
236d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
236e0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
236f0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
23700 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
23710 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
23720 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
23730 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
23740 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
23750 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23760 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
23770 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
23780 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
23790 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
237a0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
237b0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
237c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
237d0 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
237e0 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
237f0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
23800 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
23810 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
23820 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
23830 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
23840 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
23850 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
23860 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
23870 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
23880 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
23890 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
238a0 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
238b0 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
238c0 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
238d0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
238e0 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
238f0 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
23900 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
23910 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
23920 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
23930 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
23940 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
23950 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
23960 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
23970 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
23980 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
23990 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
239a0 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
239b0 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
239c0 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
239d0 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
239e0 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
239f0 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
23a00 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
23a10 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
23a20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a40 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
23a50 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
23a60 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a80 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
23a90 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
23aa0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
23ab0 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
23ac0 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
23ad0 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
23ae0 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
23b10 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
23b20 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
23b30 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
23b40 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
23b50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
23b60 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
23b70 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
23b80 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
23b90 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
23ba0 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
23bb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23bc0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
23bd0 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
23be0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
23bf0 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
23c00 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  ur);.  /* nCellK
23c10 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
23c20 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
23c30 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
23c40 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
23c50 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
23c60 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
23c70 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
23c80 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
23c90 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
23ca0 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
23cb0 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
23cc0 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
23cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23ce0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23cf0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
23d00 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
23d10 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
23d20 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
23d30 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
23d40 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
23d50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23d60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23d70 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
23d80 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23d90 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
23da0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
23db0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23dc0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
23dd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23de0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23df0 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
23e00 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
23e10 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
23e20 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
23e30 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
23e40 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
23e50 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
23e60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
23e70 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
23e80 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
23e90 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
23ea0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
23eb0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
23ec0 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
23ed0 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
23ee0 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
23ef0 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
23f00 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
23f10 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
23f20 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
23f30 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
23f40 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
23f50 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
23f60 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
23f70 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
23f80 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
23f90 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
23fa0 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
23fb0 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
23fc0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
23fd0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23fe0 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
23ff0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
24000 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
24010 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
24020 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
24030 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
24040 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
24050 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
24060 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
24070 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
24080 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
24090 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
240a0 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
240b0 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
240c0 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
240d0 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
240e0 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
240f0 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
24100 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
24110 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
24120 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
24130 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
24140 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
24150 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
24160 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
24170 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
24180 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
24190 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
241a0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
241b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
241c0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
241d0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
241e0 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
241f0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
24200 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
24210 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
24220 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24230 74 68 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41  the SQLITE_PREPA
24240 52 45 20 66 6c 61 67 73 20 66 6f 72 20 61 20 56  RE flags for a V
24250 64 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  dbe..*/.u8 sqlit
24260 65 33 56 64 62 65 50 72 65 70 61 72 65 46 6c 61  e3VdbePrepareFla
24270 67 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  gs(Vdbe *v){.  r
24280 65 74 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61  eturn v->prepFla
24290 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
242a0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
242b0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
242c0 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
242d0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
242e0 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
242f0 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
24300 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
24310 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
24320 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
24330 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
24340 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
24350 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
24360 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
24370 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
24380 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
24390 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
243a0 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
243b0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
243c0 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
243d0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
243e0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
243f0 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
24400 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
24410 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
24420 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
24430 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
24440 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
24450 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
24460 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
24470 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
24480 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ];.    assert( (
24490 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  v->db->flags & S
244a0 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
244b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
244c0 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
244d0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
244e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
244f0 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
24500 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
24510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
24520 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
24530 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
24540 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
24550 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
24560 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
24570 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
24580 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
24590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
245a0 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
245b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
245c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
245d0 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
245e0 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
245f0 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
24600 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
24610 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
24620 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
24630 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
24640 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
24650 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
24660 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
24670 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
24680 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
24690 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
246a0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
246b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
246c0 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (v->db->flags & 
246d0 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
246e0 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  G)==0 );.  if( i
246f0 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76  Var>=32 ){.    v
24700 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38  ->expmask |= 0x8
24710 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65  0000000;.  }else
24720 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
24730 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
24740 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
24750 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 20 66  ./*.** Cause a f
24760 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77  unction to throw
24770 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20   an error if it 
24780 77 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50  was call from OP
24790 5f 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74  _PureFunc.** rat
247a0 68 65 72 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63  her than OP_Func
247b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50  tion..**.** OP_P
247c0 75 72 65 46 75 6e 63 20 6d 65 61 6e 73 20 74 68  ureFunc means th
247d0 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
247e0 6d 75 73 74 20 62 65 20 64 65 74 65 72 6d 69 6e  must be determin
247f0 69 73 74 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c  istic, and shoul
24800 64 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65 72  d.** throw an er
24810 72 6f 72 20 69 66 20 69 74 20 69 73 20 67 69 76  ror if it is giv
24820 65 6e 20 69 6e 70 75 74 73 20 74 68 61 74 20 77  en inputs that w
24830 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e  ould make it non
24840 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a  -deterministic..
24850 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24860 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 64 61  is invoked by da
24870 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e  te/time function
24880 73 20 74 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64  s that use non-d
24890 65 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20  eterministic.** 
248a0 66 65 61 74 75 72 65 73 20 73 75 63 68 20 61 73  features such as
248b0 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73   'now'..*/.int s
248c0 71 6c 69 74 65 33 4e 6f 74 50 75 72 65 46 75 6e  qlite3NotPureFun
248d0 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
248e0 74 20 2a 70 43 74 78 29 7b 0a 23 69 66 64 65 66  t *pCtx){.#ifdef
248f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
24900 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
24910 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d  if( pCtx->pVdbe=
24920 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23  =0 ) return 1;.#
24930 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74 78  endif.  if( pCtx
24940 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74  ->pVdbe->aOp[pCt
24950 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d  x->iOp].opcode==
24960 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 20  OP_PureFunc ){. 
24970 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
24980 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
24990 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72        "non-deter
249a0 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
249b0 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65  n in index expre
249c0 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63  ssion or CHECK c
249d0 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20 20 20  onstraint",.    
249e0 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75     -1);.    retu
249f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
24a00 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 1;.}..#ifndef
24a10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
24a20 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
24a30 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
24a40 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
24a50 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
24a60 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
24a70 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
24a80 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
24a90 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
24aa0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
24ab0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
24ac0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
24ad0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
24ae0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
24af0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
24b00 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
24b10 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
24b20 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
24b30 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
24b40 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
24b50 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
24b60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24b70 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
24b80 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
24b90 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
24ba0 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
24bb0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
24bc0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
24bd0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
24be0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
24bf0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
24c00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
24c10 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
24c20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
24c30 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
24c40 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
24c50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
24c60 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
24c70 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
24c80 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
24c90 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
24ca0 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
24cb0 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
24cc0 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
24cd0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
24ce0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
24cf0 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
24d00 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
24d10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24d20 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
24d30 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
24d40 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
24d50 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
24d60 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
24d70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
24d80 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
24d90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
24da0 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
24db0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
24dc0 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52  Field, UnpackedR
24dd0 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
24de0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
24df0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24e00 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
24e10 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
24e20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
24e30 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
24e40 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
24e50 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
24e60 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
24e70 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
24e80 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , p);.  }.}.#end
24e90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
24ea0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
24eb0 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OK */..#ifdef SQ
24ec0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
24ed0 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a  PDATE_HOOK./*.**
24ee0 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
24ef0 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20  update hook. If 
24f00 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
24f10 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d  E or DELETE pre-
24f20 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20  update call,.** 
24f30 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73  then cursor pass
24f40 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24f50 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
24f60 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
24f70 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65  w about.** to be
24f80 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
24f90 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69  ed. If the appli
24fa0 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  cation calls sql
24fb0 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f  ite3_preupdate_o
24fc0 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71  ld(),.** the req
24fd0 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c  uired value will
24fe0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
24ff0 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
25000 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76   points to..*/.v
25010 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
25020 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20  reUpdateHook(.  
25030 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61  /* Vdbe pre-upda
25060 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te hook is invok
25070 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43  ed by */.  VdbeC
25080 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
25090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
250a0 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64  rsor to grab old
250b0 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a  .* values from *
250c0 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250e0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
250f0 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
25100 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73  DELETE */.  cons
25110 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
25120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25130 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
25140 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61    /* Modified ta
25170 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  ble */.  i64 iKe
25180 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y1,             
25190 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
251a0 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f  ial key value */
251b0 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
251e0 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20  or new.* record 
251f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
25200 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69  *db = v->db;.  i
25210 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55  64 iKey2;.  PreU
25220 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b  pdate preupdate;
25230 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25240 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tbl = pTab->zNam
25250 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  e;.  static cons
25260 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64  t u8 fakeSortOrd
25270 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  er = 0;..  asser
25280 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
25290 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e==0 );.  memset
252a0 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20  (&preupdate, 0, 
252b0 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65  sizeof(PreUpdate
252c0 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77  ));.  if( HasRow
252d0 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20  id(pTab)==0 ){. 
252e0 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32     iKey1 = iKey2
252f0 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64   = 0;.    preupd
25300 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65  ate.pPk = sqlite
25310 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
25320 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
25330 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
25340 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  ITE_UPDATE ){.  
25350 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
25360 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
25370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25380 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey2 = iKey1;. 
25390 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
253a0 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64  rt( pCsr->nField
253b0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20  ==pTab->nCol .  
253c0 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e       || (pCsr->n
253d0 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f  Field==pTab->nCo
253e0 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54  l+1 && op==SQLIT
253f0 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67  E_DELETE && iReg
25400 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72  ==-1).  );..  pr
25410 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20  eupdate.v = v;. 
25420 20 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20   preupdate.pCsr 
25430 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64  = pCsr;.  preupd
25440 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ate.op = op;.  p
25450 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67  reupdate.iNewReg
25460 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70   = iReg;.  preup
25470 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20  date.keyinfo.db 
25480 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74  = db;.  preupdat
25490 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20  e.keyinfo.enc = 
254a0 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70  ENC(db);.  preup
254b0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
254c0 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  yField = pTab->n
254d0 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
254e0 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
254f0 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  der = (u8*)&fake
25500 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
25510 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
25520 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
25530 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
25540 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
25550 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
25560 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
25570 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
25580 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
25590 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
255a0 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
255b0 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
255c0 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
255d0 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
255e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
255f0 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
25600 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
25610 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
25620 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
25630 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75  KeyField+1, preu
25640 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
25650 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
25660 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
25670 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46  te.keyinfo.nKeyF
25680 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74  ield+1, preupdat
25690 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b  e.pNewUnpacked);
256a0 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65  .  if( preupdate
256b0 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  .aNew ){.    int
256c0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
256d0 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b   i<pCsr->nField;
256e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
256f0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
25700 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e  se(&preupdate.aN
25710 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
25720 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
25730 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  N(db, preupdate.
25740 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
25750 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
25760 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
25770 4f 4f 4b 20 2a 2f 0a                             OOK */.