/ Hex Artifact Content
Login

Artifact 20da0273e9bdb3f49dafa71123d7bdd63b2656134ecd73123562c028847d0e07:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
15c0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
15d0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74  Op[i]);.    test
15e0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
15f0: 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t();.  }.#endif.
1600: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
1610: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
1620: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1630: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
1640: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1650: 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d  _COVERAGE.  pOp-
1660: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23  >iSrcLine = 0;.#
1670: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
1680: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1690: 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a  dbeAddOp0(Vdbe *
16a0: 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65  p, int op){.  re
16b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c  AddOp3(p, op, 0,
16d0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
16e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
1700: 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75   int p1){.  retu
1710: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1720: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1730: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
1740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56  ite3VdbeAddOp2(V
1750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1760: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
1770: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1780: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1790: 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d  p, p1, p2, 0);.}
17a0: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
17b0: 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64  de for an uncond
17c0: 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20  itional jump to 
17d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73  instruction iDes
17e0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
17f0: 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70  VdbeGoto(Vdbe *p
1800: 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20  , int iDest){.  
1810: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1820: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47  beAddOp3(p, OP_G
1830: 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30  oto, 0, iDest, 0
1840: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
1850: 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20  e code to cause 
1860: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20  the string zStr 
1870: 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  to be loaded int
1880: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44  o.** register iD
1890: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
18a0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
18b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
18c0: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
18d0: 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e  *zStr){.  return
18e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f0: 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(p, OP_String8
1900: 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a  , 0, iDest, 0, z
1910: 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str, 0);.}../*.*
1920: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1930: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1940: 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74   multiple regist
1950: 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72  ers to string or
1960: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
1970: 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  tants.  The regi
1980: 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68  sters begin with
1990: 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65   iDest and incre
19a0: 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c  ase consecutivel
19b0: 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74  y..** One regist
19c0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
19d0: 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  d for each chara
19e0: 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b  cgter in zTypes[
19f0: 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20  ].  For each.** 
1a00: 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e  "s" character in
1a10: 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72   zTypes[], the r
1a20: 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72  egister is a str
1a30: 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d  ing if the argum
1a40: 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55  ent is.** not NU
1a50: 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69  LL, or OP_Null i
1a60: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1a70: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20   null pointer.  
1a80: 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61  For each "i" cha
1a90: 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79  racter.** in zTy
1aa0: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1ab0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1ac0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
1ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1ae0: 6e 70 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73  nput string does
1af0: 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58   not end with "X
1b00: 22 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73  " then an OP_Res
1b10: 75 6c 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69  ultRow instructi
1b20: 6f 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  on.** is generat
1b30: 65 64 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ed for the value
1b40: 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76  s inserted..*/.v
1b50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
1b60: 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70  ultiLoad(Vdbe *p
1b70: 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e  , int iDest, con
1b80: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c  st char *zTypes,
1b90: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1ba0: 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   ap;.  int i;.  
1bb0: 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61  char c;.  va_sta
1bc0: 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a  rt(ap, zTypes);.
1bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
1be0: 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69  zTypes[i])!=0; i
1bf0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
1c00: 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  's' ){.      con
1c10: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f  st char *z = va_
1c20: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1c30: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
1c40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1c50: 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20   z==0 ? OP_Null 
1c60: 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  : OP_String8, 0,
1c70: 20 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20   iDest+i, 0, z, 
1c80: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
1c90: 28 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  ( c=='i' ){.    
1ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb0: 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(p, OP_Intege
1cc0: 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  r, va_arg(ap, in
1cd0: 74 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20  t), iDest+i);.  
1ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1cf0: 6f 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75  oto skip_op_resu
1d00: 6c 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d  ltrow;.    }.  }
1d10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d20: 64 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(p, OP_Resul
1d30: 74 52 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b  tRow, iDest, i);
1d40: 0a 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72  .skip_op_resultr
1d50: 6f 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  ow:.  va_end(ap)
1d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1d70: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1d80: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1d90: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1da0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1db0: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1dc0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1dd0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1de0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
1df0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1e00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e10: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
1e20: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
1e30: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
1e40: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e60: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1e70: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e90: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1eb0: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1ed0: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1ee0: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
1ef0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
1f00: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f10: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1f20: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1f30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1f40: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1f50: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1f60: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1f70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1f80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1f90: 70 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  p4 value with a 
1fa0: 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50  P4_INT64 or.** P
1fb0: 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a  4_REAL type..*/.
1fc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1fd0: 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62  ddOp4Dup8(.  Vdb
1fe0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ff0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
2000: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
2010: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2020: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2030: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
2040: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2050: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
2060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2080: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
2090: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
20b0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
20c0: 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20  onst u8 *zP4,   
20d0: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
20e0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
20f0: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
2100: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
2110: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
2120: 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  4copy = sqlite3D
2130: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c  bMallocRawNN(sql
2140: 69 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38  ite3VdbeDb(p), 8
2150: 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20  );.  if( p4copy 
2160: 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c  ) memcpy(p4copy,
2170: 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75   zP4, 8);.  retu
2180: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
2190: 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp4(p, op, p1, 
21a0: 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20  p2, p3, p4copy, 
21b0: 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e  p4type);.}..#ifn
21c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65  EXPLAIN./*.** Re
21e0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
21f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2200: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2210: 41 4e 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20  AN baseline..** 
2220: 30 20 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a  0 means "none"..
2230: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2240: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2250: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2260: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2270: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
2280: 72 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  rExplain==0 ) re
2290: 74 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20  turn 0;.  pOp = 
22a0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
22b0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
22d0: 61 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ain);.  return p
22e0: 4f 70 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op->p2;.}../*.**
22f0: 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78   Add a new OP_Ex
2300: 70 6c 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  plain opcode..**
2310: 0a 2a 2a 20 49 66 20 74 68 65 20 62 50 75 73 68  .** If the bPush
2320: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
2330: 68 65 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70  hen make this op
2340: 63 6f 64 65 20 74 68 65 20 70 61 72 65 6e 74 20  code the parent 
2350: 66 6f 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  for.** subsequen
2360: 74 20 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c  t Explains until
2370: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
2380: 61 69 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c  ainPop() is call
2390: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
23a0: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50  te3VdbeExplain(P
23b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38  arse *pParse, u8
23c0: 20 62 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68   bPush, const ch
23d0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
23e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
23f0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2400: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
2410: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f  Vdbe *v;.    va_
2420: 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74  list ap;.    int
2430: 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73   iThis;.    va_s
2440: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2450: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
2460: 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73  e3VMPrintf(pPars
2470: 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29  e->db, zFmt, ap)
2480: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
2490: 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  ;.    v = pParse
24a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68  ->pVdbe;.    iTh
24b0: 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  is = v->nOp;.   
24c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24d0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
24e0: 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d  , iThis, pParse-
24f0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c  >addrExplain, 0,
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2510: 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f         zMsg, P4_
2520: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66  DYNAMIC);.    if
2530: 28 20 62 50 75 73 68 29 20 70 50 61 72 73 65 2d  ( bPush) pParse-
2540: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69  >addrExplain = i
2550: 54 68 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  This;.  }.}../*.
2560: 2a 2a 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41  ** Pop the EXPLA
2570: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74  IN QUERY PLAN st
2580: 61 63 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a  ack one level..*
2590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25a0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72  beExplainPop(Par
25b0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
25c0: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
25d0: 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  in = sqlite3Vdbe
25e0: 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50  ExplainParent(pP
25f0: 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  arse);.}.#endif 
2600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
2610: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
2620: 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65   Add an OP_Parse
2630: 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20  Schema opcode.  
2640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2650: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a  broken out from.
2660: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
2670: 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20  dOp4() since it 
2680: 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65  needs to also ne
2690: 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20  eds to mark all 
26a0: 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76  btrees.** as hav
26b0: 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a  ing been used..*
26c0: 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20  *.** The zWhere 
26d0: 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65  string must have
26e0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
26f0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
2700: 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  oc()..** This ro
2710: 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20  utine will take 
2720: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
2730: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
2740: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
2750: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
2760: 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20  hemaOp(Vdbe *p, 
2770: 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a  int iDb, char *z
2780: 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b  Where){.  int j;
2790: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
27a0: 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65  dOp4(p, OP_Parse
27b0: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
27c0: 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59  0, zWhere, P4_DY
27d0: 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d  NAMIC);.  for(j=
27e0: 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b  0; j<p->db->nDb;
27f0: 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62   j++) sqlite3Vdb
2800: 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29  eUsesBtree(p, j)
2810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2820: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
2830: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
2840: 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65  lue as an intege
2850: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a  3VdbeAddOp4Int(.
2870: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
2880: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
2890: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
28a0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28c0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
28d0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
28f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2900: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
2910: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
2920: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2940: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
2950: 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20  /.  int p4      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2970: 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20  4 operand as an 
2980: 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20  integer */.){.  
2990: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
29a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
29b0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
29c0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
29d0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
29e0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
29f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
2a00: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
2a10: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
2a20: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34    pOp->p4.i = p4
2a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2a40: 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72  ddr;.}../* Inser
2a50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63  t the end of a c
2a60: 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69  o-routine.*/.voi
2a70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64  d sqlite3VdbeEnd
2a80: 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a  Coroutine(Vdbe *
2a90: 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29  v, int regYield)
2aa0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
2ab0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
2ac0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
2ad0: 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  ld);..  /* Clear
2ae0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72   the temporary r
2af0: 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74  egister cache, t
2b00: 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20  hereby ensuring 
2b10: 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63  that each.  ** c
2b20: 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74  o-routine has it
2b30: 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e  s own independen
2b40: 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65  t set of registe
2b50: 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72  rs, because co-r
2b60: 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67  outines.  ** mig
2b70: 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20  ht expect their 
2b80: 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20  registers to be 
2b90: 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73  preserved across
2ba0: 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e   an OP_Yield, an
2bb0: 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c  d.  ** that coul
2bc0: 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
2bd0: 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
2be0: 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20  co-routines are 
2bf0: 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
2c00: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65   ** temporary re
2c10: 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76  gister..  */.  v
2c20: 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ->pParse->nTempR
2c30: 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61  eg = 0;.  v->pPa
2c40: 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2c50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2c60: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
2c70: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
2c80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
2c90: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
2ca0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
2cb0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
2cc0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
2cd0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
2ce0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
2cf0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
2d00: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
2d10: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
2d20: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
2d30: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
2d40: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
2d50: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
2d60: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
2d70: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
2d80: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
2d90: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
2da0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
2db0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
2dc0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
2dd0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
2de0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
2df0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
2e00: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
2e10: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
2e20: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
2e30: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
2e40: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
2e50: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
2e60: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
2e70: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
2e80: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
2e90: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
2ea0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
2ed0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2ee0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
2ef0: 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  v){.  Parse *p =
2f00: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
2f10: 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b  t i = p->nLabel+
2f20: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  +;.  assert( v->
2f30: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2f40: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2f50: 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29  (i & (i-1))==0 )
2f60: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  {.    p->aLabel 
2f70: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2f80: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
2f90: 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20  p->aLabel, .    
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f     (i*2+1)*sizeo
2fd0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29  f(p->aLabel[0]))
2fe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
2ff0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
3000: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a  aLabel[i] = -1;.
3010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44    }.  return ADD
3020: 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  R(i);.}../*.** R
3030: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
3040: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
3050: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3060: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
3070: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
3080: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
3090: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
30a0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
30b0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
30c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
30d0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
30e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30f0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  lveLabel(Vdbe *v
3100: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73  , int x){.  Pars
3110: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
3120: 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52  ;.  int j = ADDR
3130: 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  (x);.  assert( v
3140: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3150: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
3160: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65  sert( j<p->nLabe
3170: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  l );.  assert( j
3180: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3190: 61 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66  aLabel ){.#ifdef
31a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
31b0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
31c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
31d0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
31e0: 20 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f      printf("RESO
31f0: 4c 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20  LVE LABEL %d to 
3200: 25 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70  %d\n", x, v->nOp
3210: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
3220: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
3230: 4c 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29  Label[j]==(-1) )
3240: 3b 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20  ; /* Labels may 
3250: 6f 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64  only be resolved
3260: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e   once */.    p->
3270: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3280: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
3290: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
32a0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
32b0: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
32c0: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
32d0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
32e0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
32f0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
3300: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
3310: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
3320: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
3330: 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20  be run multiple 
3340: 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  times..*/.void s
3350: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
3360: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  le(Vdbe *p){.  p
3370: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
3380: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
3390: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
33a0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
33b0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
33c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
33d0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
33e0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
33f0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3400: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
3410: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
3420: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
3430: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
3440: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
3450: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
3460: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
3470: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
3480: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
3490: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
34a0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
34b0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
34c0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
34d0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
34e0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
34f0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
3520: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
3530: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3540: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3550: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
3560: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
3570: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
3580: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3590: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
35a0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
35b0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
35c0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
35d0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
35e0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
35f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3600: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
3610: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
3620: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
3630: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
3640: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
3650: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
3660: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
3670: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
3680: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3690: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
36a0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
36b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
36c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
36d0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
36e0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
36f0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
3720: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
3730: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
3740: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
3750: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
3760: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
3770: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
3780: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
3790: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
37a0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
37b0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
37c0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
37d0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
37e0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
37f0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
3800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
3810: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
3820: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
3830: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3840: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3860: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3870: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3880: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3890: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
38a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
38b0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
38c0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
38d0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
38e0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
38f0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
3900: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
3910: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
3920: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
3930: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3940: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3950: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3960: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3970: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3980: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3990: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
39a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
39b0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
39c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
39d0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
39e0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
39f0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
3a00: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
3a10: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
3a20: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
3a30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3a40: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3a50: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3a60: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3a70: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3a80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3a90: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3ab0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3ac0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
3ad0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
3ae0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
3af0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
3b00: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
3b10: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
3b20: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
3b30: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3b40: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3b50: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3b60: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3b70: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3b80: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3b90: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3ba0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3bc0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
3bd0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3be0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3bf0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
3c00: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
3c10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
3c20: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
3c30: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3c40: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3c50: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3c60: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3c70: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3c80: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3c90: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3ca0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3cb0: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72   *  OP_CreateBtr
3cc0: 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  ee/BTREE_INTKEY 
3cd0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
3ce0: 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66  tine .**      (f
3cf0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
3d00: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
3d10: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
3d20: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
3d30: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3d40: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3d50: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3d60: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3d70: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3d80: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3d90: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3da0: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3db0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3dc0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
3dd0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
3de0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
3df0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
3e00: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
3e10: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
3e20: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
3e30: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3e40: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3e50: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3e60: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3e70: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3e80: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3e90: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3ea0: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3eb0: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3ec0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3ed0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
3ee0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
3ef0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
3f00: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
3f10: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
3f20: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3f30: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3f40: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3f50: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3f60: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3f70: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3f80: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3f90: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3fa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3fb0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3fc0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3fd0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
3fe0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
3ff0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
4000: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
4010: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
4020: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
4030: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
4040: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
4050: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
4060: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
4070: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
4080: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4090: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
40a0: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
40b0: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20  =BTREE_INTKEY ) 
40c0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
40d0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
40e0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
40f0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
4100: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
4110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4120: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4130: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4140: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
4150: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
4160: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
4170: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
4180: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4190: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
41a0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
41b0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
41c0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
41d0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
41e0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
41f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
4200: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
4210: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
4220: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
4230: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
4240: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
4250: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
4260: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
4270: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
4280: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
4290: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
42a0: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
42b0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
42c0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
42d0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
42e0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
42f0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
4300: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
4310: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
4320: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
4340: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
4350: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
4360: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
4370: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
4380: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
4390: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
43a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  function */..#if
43b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
43c0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
43d0: 20 74 68 65 20 6e 57 72 69 74 65 20 63 6f 75 6e   the nWrite coun
43e0: 74 65 72 20 69 6e 20 74 68 65 20 56 44 42 45 20  ter in the VDBE 
43f0: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
4400: 20 6e 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65 6d   not an.** ephem
4410: 65 72 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72 20  eral cursor, or 
4420: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 72  if the cursor ar
4430: 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a  gument is NULL..
4440: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4450: 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
4460: 74 65 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ter(Vdbe *p, Vdb
4470: 65 43 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20 20  eCursor *pC){.  
4480: 69 66 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c 20  if( pC==0.   || 
4490: 28 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43  (pC->eCurType!=C
44a0: 55 52 54 59 50 45 5f 53 4f 52 54 45 52 0a 20 20  URTYPE_SORTER.  
44b0: 20 20 20 20 20 26 26 20 70 43 2d 3e 65 43 75 72       && pC->eCur
44c0: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53  Type!=CURTYPE_PS
44d0: 45 55 44 4f 0a 20 20 20 20 20 20 20 26 26 20 21  EUDO.       && !
44e0: 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 29  pC->isEphemeral)
44f0: 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57 72  .  ){.    p->nWr
4500: 69 74 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ite++;.  }.}.#en
4510: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4520: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41  TE_DEBUG./*.** A
4530: 73 73 65 72 74 20 69 66 20 61 6e 20 41 62 6f 72  ssert if an Abor
4540: 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  t at this point 
4550: 69 6e 20 74 69 6d 65 20 6d 69 67 68 74 20 72 65  in time might re
4560: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70  sult in a corrup
4570: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  t.** database..*
4580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4590: 62 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c  beAssertAbortabl
45a0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  e(Vdbe *p){.  as
45b0: 73 65 72 74 28 20 70 2d 3e 6e 57 72 69 74 65 3d  sert( p->nWrite=
45c0: 3d 30 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74 6d  =0 || p->usesStm
45d0: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65  tJournal );.}.#e
45e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
45f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4600: 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ed after all opc
4610: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
4620: 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f  nserted.  It loo
4630: 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  ps.** through al
4640: 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e  l the opcodes an
4650: 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20  d fixes up some 
4660: 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28  details..**.** (
4670: 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70  1) For each jump
4680: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74   instruction wit
4690: 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  h a negative P2 
46a0: 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a  value (a label).
46b0: 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74  **     resolve t
46c0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61  he P2 value to a
46d0: 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73  n actual address
46e0: 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70  ..**.** (2) Comp
46f0: 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ute the maximum 
4700: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
4710: 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20  nts used by any 
4720: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  SQL function.** 
4730: 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68      and store th
4740: 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61  at value in *pMa
4750: 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a  xFuncArgs..**.**
4760: 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20   (3) Update the 
4770: 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e  Vdbe.readOnly an
4780: 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72  d Vdbe.bIsReader
4790: 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61   flags to accura
47a0: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69  tely.**     indi
47b0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72  cate what the pr
47c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
47d0: 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a   actually does..
47e0: 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61  **.** (4) Initia
47f0: 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76  lize the p4.xAdv
4800: 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  ance pointer on 
4810: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65  opcodes that use
4820: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52   it..**.** (5) R
4830: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
4840: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  y allocated for 
4850: 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a  storing labels..
4860: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4870: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e  ne will only fun
4880: 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20  ction correctly 
4890: 69 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  if the mkopcodeh
48a0: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a  .tcl generator.*
48b0: 2a 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73  * script numbers
48c0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72   the opcodes cor
48d0: 72 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73  rectly.  Changes
48e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
48f0: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72   must be.** coor
4900: 64 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61  dinated with cha
4910: 6e 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65  nges to mkopcode
4920: 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  h.tcl..*/.static
4930: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
4940: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
4950: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
4960: 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  ){.  int nMaxArg
4970: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
4980: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
4990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
49a0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
49b0: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
49c0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
49d0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
49e0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
49f0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
4a00: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77  p[p->nOp-1];.  w
4a10: 68 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a  hile(1){..    /*
4a20: 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64   Only JUMP opcod
4a30: 65 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74  es and the short
4a40: 20 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c   list of special
4a50: 20 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20   opcodes in the 
4a60: 73 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65  switch.    ** be
4a70: 6c 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63  low need to be c
4a80: 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20  onsidered.  The 
4a90: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65  mkopcodeh.tcl ge
4aa0: 6e 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67  nerator script g
4ab0: 72 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c  roups.    ** all
4ac0: 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74   these opcodes t
4ad0: 6f 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65  ogether near the
4ae0: 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70   front of the op
4af0: 63 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70  code list.  Skip
4b00: 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f  .    ** any opco
4b10: 64 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  de that does not
4b20: 20 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67   need processing
4b30: 20 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74   by virtual of t
4b40: 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20  he fact that.   
4b50: 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72   ** it is larger
4b60: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f   than SQLITE_MX_
4b70: 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20  JUMP_OPCODE, as 
4b80: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
4b90: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
4ba0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  */.    if( pOp->
4bb0: 6f 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d  opcode<=SQLITE_M
4bc0: 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b  X_JUMP_OPCODE ){
4bd0: 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  .      /* NOTE: 
4be0: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
4bf0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20  e mkopcodeh.tcl 
4c00: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
4c10: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a  emoving.      **
4c20: 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73   cases from this
4c30: 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20   switch! */.    
4c40: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
4c50: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
4c60: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
4c70: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
4c80: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30    if( pOp->p2!=0
4c90: 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   ) p->readOnly =
4ca0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   0;.          /*
4cb0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
4cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4cd0: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
4ce0: 69 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  it:.        case
4cf0: 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b   OP_Savepoint: {
4d00: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
4d10: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4d20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4d30: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
4d50: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4d60: 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64  Checkpoint:.#end
4d70: 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  if.        case 
4d80: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
4d90: 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e     case OP_Journ
4da0: 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20  alMode: {.      
4db0: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
4dc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
4dd0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
4de0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4df0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4e00: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4e10: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4e20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
4e30: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4e40: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
4e50: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
4e60: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
4e70: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
4e80: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E;.          /* 
4e90: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
4ea0: 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61  or never codes a
4eb0: 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f  ny of these opco
4ec0: 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20  des as a jump.  
4ed0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20          ** to a 
4ee0: 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65  label.  They are
4ef0: 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73   always coded as
4f00: 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64   a jump backward
4f10: 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20  s to a .        
4f20: 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65    ** known addre
4f30: 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ss */.          
4f40: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
4f50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
4f60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4f70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4f80: 5f 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20  _Prev: {.       
4f90: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4fa0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4fb0: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4fc0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4fd0: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4ff0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
5000: 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20  never codes any 
5010: 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73  of these opcodes
5020: 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20   as a jump.     
5030: 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62       ** to a lab
5040: 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c  el.  They are al
5050: 77 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20  ways coded as a 
5060: 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74  jump backwards t
5070: 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a  o a .          *
5080: 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20  * known address 
5090: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
50a0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20  ert( pOp->p2>=0 
50b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
50c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ak;.        }.#i
50d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5100: 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20  Update: {.      
5110: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
5120: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5130: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
5140: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5160: 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65    case OP_VFilte
5170: 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r: {.          i
5180: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
5190: 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70  assert( (pOp - p
51a0: 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20  ->aOp) >= 3 );. 
51b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
51c0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
51d0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
51e0: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70           n = pOp
51f0: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20  [-1].p1;.       
5200: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
5210: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
5220: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;.          /* F
5230: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
5240: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73   the default cas
5250: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23  e */.        }.#
5260: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65  endif.        de
5270: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
5280: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30     if( pOp->p2<0
5290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
52a0: 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  /* The mkopcodeh
52b0: 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20  .tcl script has 
52c0: 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e  so arranged thin
52d0: 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79  gs that the only
52e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
52f0: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
5300: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
5310: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
5320: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
5330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
5340: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
5350: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
5360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5370: 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33  assert( (sqlite3
5380: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
5390: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
53a0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a  FLG_JUMP)!=0 );.
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
53c0: 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32  rt( ADDR(pOp->p2
53d0: 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  )<pParse->nLabel
53e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
53f0: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
5400: 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b  [ADDR(pOp->p2)];
5410: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f        /* The mko
5450: 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70  pcodeh.tcl scrip
5460: 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65  t has so arrange
5470: 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68  d things that th
5480: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  e only.      ** 
5490: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
54a0: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
54b0: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
54c0: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
54d0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e  .      ** have n
54e0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
54f0: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5500: 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c      assert( (sql
5510: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
5520: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26  ty[pOp->opcode]&
5530: 4f 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c  OPFLG_JUMP)==0 |
5540: 7c 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20  | pOp->p2>=0);. 
5550: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
5560: 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b  ==p->aOp ) break
5570: 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d  ;.    pOp--;.  }
5580: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5590: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
55a0: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
55b0: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
55c0: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
55d0: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
55e0: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
55f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
5600: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
5610: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
5620: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
5630: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5640: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
5650: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
5660: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
5670: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5680: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
5690: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
56a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
56b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
56c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
56d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
56e0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
56f0: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
5700: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
5710: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5720: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
5730: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
5740: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
5750: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
5760: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
5770: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
5780: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
5790: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
57a0: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
57b0: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
57c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
57d0: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
57e0: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
57f0: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
5800: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
5810: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
5820: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
5830: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
5840: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
5850: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
5860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5870: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
5880: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
5890: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
58a0: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
58b0: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
58c0: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
58d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
58e0: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
58f0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
5900: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5910: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
5920: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
5930: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5940: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5950: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
5960: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
5970: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
5980: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
5990: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
59a0: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
59b0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
59c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
59d0: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
59e0: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
59f0: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
5a00: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
5a10: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
5a20: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
5a30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5a40: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
5a50: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
5a60: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
5a70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
5a80: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
5a90: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5aa0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
5ab0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
5ac0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
5ad0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
5ae0: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
5af0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5b00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
5b10: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
5b20: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
5b30: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
5b40: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
5b50: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
5b60: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
5b70: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
5b80: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
5b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5ba0: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
5bb0: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
5bc0: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
5bd0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
5be0: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
5bf0: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
5c00: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
5c10: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
5c20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
5c30: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5c40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5c50: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
5c60: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
5c70: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
5c80: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5c90: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
5ca0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
5cb0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
5cc0: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
5cd0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
5ce0: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
5cf0: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
5d00: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
5d10: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
5d20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
5d30: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
5d40: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
5d50: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
5d60: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
5d70: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
5d80: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
5d90: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
5da0: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
5db0: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
5dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
5dd0: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
5de0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
5df0: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
5e00: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
5e10: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
5e20: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5e30: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
5e40: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
5e50: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
5e60: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
5e70: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
5e80: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
5e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5ea0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
5eb0: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
5ec0: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
5ed0: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
5ee0: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
5ef0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
5f00: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
5f10: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
5f20: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
5f30: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
5f40: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
5f50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
5f70: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
5f80: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
5f90: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
5fa0: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
5fb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
5fc0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
5fd0: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
5fe0: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
5ff0: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6000: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
6010: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
6020: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
6030: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
6040: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
6050: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
6060: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6070: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6080: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6090: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
60a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
60b0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
60c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
60d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6100: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6110: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6120: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6130: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6140: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6150: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6180: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6190: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
61a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
61b0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
61c0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
61d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
61e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
61f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6200: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6210: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
6220: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
6230: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
6240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6250: 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75  }.  pFirst = pOu
6260: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  t = &p->aOp[p->n
6270: 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Op];.  for(i=0; 
6280: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b  i<nOp; i++, aOp+
6290: 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  +, pOut++){.    
62a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61  pOut->opcode = a
62b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
62c0: 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e  pOut->p1 = aOp->
62d0: 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32  p1;.    pOut->p2
62e0: 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = aOp->p2;.    
62f0: 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e  assert( aOp->p2>
6300: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73  =0 );.    if( (s
6310: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
6320: 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65  erty[aOp->opcode
6330: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
6340: 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20  =0 && aOp->p2>0 
6350: 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  ){.      pOut->p
6360: 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  2 += p->nOp;.   
6370: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20   }.    pOut->p3 
6380: 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70  = aOp->p3;.    p
6390: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
63a0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f  _NOTUSED;.    pO
63b0: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
63c0: 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a    pOut->p5 = 0;.
63d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
63e0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
63f0: 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e  MENTS.    pOut->
6400: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
6410: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
6420: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6430: 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c  .    pOut->iSrcL
6440: 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b  ine = iLineno+i;
6450: 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64  .#else.    (void
6460: 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66  )iLineno;.#endif
6470: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6480: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
6490: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
64a0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
64b0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
64c0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
64d0: 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61   i+p->nOp, &p->a
64e0: 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20  Op[i+p->nOp]);. 
64f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
6500: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
6510: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74  .  return pFirst
6520: 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
6530: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
6540: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a  TMT_SCANSTATUS).
6550: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74  /*.** Add an ent
6560: 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  ry to the array 
6570: 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61  of counters mana
6580: 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73  ged by sqlite3_s
6590: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29  tmt_scanstatus()
65a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
65b0: 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28  3VdbeScanStatus(
65c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20     /* VM to add 
65f0: 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20  scanstatus() to 
6600: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70  */.  int addrExp
6610: 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lain,           
6620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6630: 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f  of OP_Explain (o
6640: 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  r 0) */.  int ad
6650: 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  drLoop,         
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6670: 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75  ress of loop cou
6680: 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61  nter */ .  int a
6690: 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20  ddrVisit,       
66a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
66b0: 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69  dress of rows vi
66c0: 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f  sited counter */
66d0: 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20  .  LogEst nEst, 
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
6700: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
6710: 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74   rows */.  const
6720: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
6730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6740: 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69  me of table or i
6750: 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e  ndex being scann
6760: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ed */.){.  int n
6770: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e  Byte = (p->nScan
6780: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61  +1) * sizeof(Sca
6790: 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e  nStatus);.  Scan
67a0: 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20  Status *aNew;.  
67b0: 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74  aNew = (ScanStat
67c0: 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61  us*)sqlite3DbRea
67d0: 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lloc(p->db, p->a
67e0: 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Scan, nByte);.  
67f0: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
6800: 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77  ScanStatus *pNew
6810: 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61   = &aNew[p->nSca
6820: 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n++];.    pNew->
6830: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64  addrExplain = ad
6840: 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70  drExplain;.    p
6850: 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20  New->addrLoop = 
6860: 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e  addrLoop;.    pN
6870: 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  ew->addrVisit = 
6880: 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70  addrVisit;.    p
6890: 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74  New->nEst = nEst
68a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ;.    pNew->zNam
68b0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
68c0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Dup(p->db, zName
68d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20  );.    p->aScan 
68e0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65  = aNew;.  }.}.#e
68f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
6900: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6910: 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20   the opcode, or 
6920: 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50  P1, P2, P3, or P
6930: 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f  5 operands.** fo
6940: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
6950: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6960: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6970: 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  ngeOpcode(Vdbe *
6980: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20  p, u32 addr, u8 
6990: 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73  iNewOpcode){.  s
69a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
69b0: 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20  p,addr)->opcode 
69c0: 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a  = iNewOpcode;.}.
69d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
69e0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
69f0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
6a00: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
6a10: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
6a20: 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p1 = val;.}.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
6a40: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
6a50: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
6a60: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
6a70: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
6a80: 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p2 = val;.}.void
6a90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6aa0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
6ab0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
6ac0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
6ad0: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33  etOp(p,addr)->p3
6ae0: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
6af0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6b00: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20  P5(Vdbe *p, u16 
6b10: 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p5){.  assert( p
6b20: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62  ->nOp>0 || p->db
6b30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6b40: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  ;.  if( p->nOp>0
6b50: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
6b60: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
6b70: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6b80: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
6b90: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
6ba0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
6bb0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
6bc0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
6bd0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
6be0: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
6bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6c00: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
6c10: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
6c20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
6c30: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
6c40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6c50: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
6c60: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
6c70: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
6c80: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
6c90: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
6ca0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
6cb0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
6cc0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
6cd0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
6ce0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
6cf0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
6d00: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
6d10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
6d20: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
6d30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6d40: 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  NN(db, pDef);.  
6d50: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
6d60: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
6d70: 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a  (sqlite3 *, Op *
6d80: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  , int);../*.** D
6d90: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
6da0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6db0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
6dc0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
6dd0: 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20  eeP4Mem(sqlite3 
6de0: 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20  *db, Mem *p){.  
6df0: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
6e00: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
6e10: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
6e20: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6e30: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
6e40: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
6e50: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
6e60: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
6e70: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
6e80: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
6e90: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
6ea0: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
6ec0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
6ed0: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
6ee0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
6ef0: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
6f00: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  {.  assert( db )
6f10: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79  ;.  switch( p4ty
6f20: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6f30: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
6f40: 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78     freeP4FuncCtx
6f50: 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f  (db, (sqlite3_co
6f60: 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20  ntext*)p4);.    
6f70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6f80: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
6f90: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6fa0: 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  64:.    case P4_
6fb0: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73  DYNAMIC:.    cas
6fc0: 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20  e P4_DYNBLOB:.  
6fd0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6fe0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6ff0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
7000: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7010: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7020: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7030: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
7040: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
7050: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7060: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
7070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7080: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7090: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
70a0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
70b0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
70c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
70d0: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
70e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
70f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7100: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7110: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
7120: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
7130: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
7140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7150: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7160: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
7170: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7180: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
7190: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
71a0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
71b0: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
71c0: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
71d0: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
71e0: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
71f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7200: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
7210: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7220: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7230: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
7240: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
7250: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7270: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
7280: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
7290: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
72a0: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
72b0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
72c0: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
72d0: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
72e0: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
72f0: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7300: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
7310: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
7320: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7330: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
7340: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
7350: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
7360: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
7370: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
7380: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
7390: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
73a0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
73b0: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
73c0: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
73d0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
73e0: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
73f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7400: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
7410: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7420: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
7430: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
7440: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7450: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
7460: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7470: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
7480: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
7490: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
74a0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
74b0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
74c0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
74d0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
74e0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
74f0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
7500: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
7510: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
7520: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
7530: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7540: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7550: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
7560: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
7570: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
7580: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
7590: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
75a0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
75b0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
75c0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
75d0: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
75e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
75f0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
7600: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
7610: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
7620: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
7640: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
7650: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
7660: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
7670: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
7680: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
7690: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
76a0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
76b0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
76c0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
76d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
76e0: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
76f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
7700: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
7710: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
7720: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
7730: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
7740: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
7750: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
7760: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
7770: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
7780: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7790: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
77a0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
77b0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
77c0: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
77d0: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
77e0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
77f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7800: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
7810: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
7820: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7840: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
7850: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
7860: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
7870: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
7890: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
78a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
78b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
78c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
78d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
78e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
78f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
7900: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
7910: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
7920: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
7930: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
7940: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
7950: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
7960: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
7970: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
7980: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
7990: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
79a0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
79b0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
79c0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
79d0: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
79e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
79f0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
7a00: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
7a10: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
7a20: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
7a30: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
7a40: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
7a50: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
7a60: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
7a70: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
7a80: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7a90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7aa0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
7ab0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
7ac0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
7ad0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
7ae0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
7af0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
7b00: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
7b10: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
7b20: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7b30: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
7b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
7b50: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
7b60: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
7b70: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
7b80: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
7b90: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
7ba0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
7bb0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
7bc0: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
7bd0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
7be0: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
7bf0: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
7c00: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
7c10: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
7c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7c30: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
7c40: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
7c50: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
7c60: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
7c70: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7c80: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
7c90: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
7ca0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
7cb0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
7cc0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
7cd0: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
7ce0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7cf0: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
7d00: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
7d10: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
7d20: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
7d30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
7d40: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
7d50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7d60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
7d70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
7d80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7d90: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
7da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7db0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7dc0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
7dd0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
7de0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
7df0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
7e00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7e10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
7e20: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
7e30: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
7e40: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
7e50: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
7e60: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
7e70: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
7e80: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
7e90: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
7ea0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
7eb0: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
7ec0: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
7ed0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
7ee0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
7ef0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
7f00: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
7f10: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
7f20: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
7f30: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
7f40: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
7f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
7f60: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
7f70: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
7f80: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
7f90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
7fa0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
7fb0: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7fc0: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7fd0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7fe0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7ff0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
8000: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
8010: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
8020: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
8030: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
8040: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8050: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
8060: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
8070: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
8080: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
8090: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
80a0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
80b0: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
80c0: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
80d0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
80e0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
80f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
8100: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
8110: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
8120: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
8130: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
8140: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
8150: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
8160: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
8170: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
8180: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
8190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
81a0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
81b0: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
81c0: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
81d0: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
81e0: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
81f0: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
8200: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
8210: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
8220: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
8230: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
8240: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
8250: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
8260: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8270: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
8280: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
8290: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
82a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
82b0: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
82c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
82d0: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
82e0: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
82f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8300: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8310: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
8320: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
8330: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
8340: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
8350: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8360: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
8370: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
8380: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
8390: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
83a0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
83b0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
83c0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
83d0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
83e0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
83f0: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
8400: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
8410: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
8420: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
8430: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
8440: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8450: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8460: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
8470: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
8480: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
8490: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
84a0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
84b0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
84c0: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
84d0: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
84e0: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
84f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
8500: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
8510: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
8520: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
8530: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
8540: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
8550: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
8560: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
8570: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
8580: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8590: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
85a0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
85b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
85c0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
85d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
85e0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
85f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8600: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
8610: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8620: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
8630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
8640: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
8650: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
8660: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8670: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
8680: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8690: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
86a0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
86b0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
86c0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
86d0: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
86e0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
86f0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
8700: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
8710: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
8720: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
8730: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
8740: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
8750: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
8760: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
8770: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
8780: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
8790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
87a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
87b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
87c0: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
87d0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
87e0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
87f0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8800: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
8810: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
8820: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
8830: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
8840: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
8850: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8860: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
8870: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
8880: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
8890: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
88a0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
88b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
88c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
88d0: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
88e0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
88f0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
8900: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
8910: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
8920: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8930: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
8940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
8950: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
8960: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
8970: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
8980: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
8990: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
89a0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
89b0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
89c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
89d0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
89e0: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
89f0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
8a00: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
8a10: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
8a20: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
8a30: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
8a40: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
8a50: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
8a60: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
8a70: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
8a80: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
8a90: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
8aa0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
8ab0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
8ac0: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
8ad0: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
8ae0: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
8af0: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
8b00: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
8b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
8b20: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
8b30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8b40: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
8b50: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
8b60: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
8b70: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
8b80: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
8b90: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
8ba0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
8bb0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
8bc0: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
8bd0: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
8be0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
8bf0: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
8c00: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
8c10: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
8c20: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
8c30: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
8c40: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
8c50: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
8c60: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
8c70: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
8c80: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
8c90: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
8ca0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
8cb0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
8cc0: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
8cd0: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
8ce0: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
8cf0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8d00: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
8d10: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
8d20: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
8d30: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
8d40: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
8d50: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
8d60: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8d70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8d80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8d90: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
8da0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
8db0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
8dc0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
8dd0: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
8de0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8df0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8e00: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
8e10: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
8e20: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
8e30: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
8e40: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
8e50: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
8e60: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
8e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
8e80: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
8e90: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
8ea0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
8eb0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
8ec0: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
8ed0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
8ee0: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
8ef0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
8f00: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
8f10: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
8f20: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
8f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8f40: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
8f50: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
8f60: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
8f70: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
8f80: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
8f90: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
8fa0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
8fb0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
8fc0: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
8fd0: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
8fe0: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
8ff0: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
9000: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
9010: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
9020: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
9030: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
9040: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
9050: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
9060: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
9070: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
9080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
9090: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
90a0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
90b0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
90c0: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
90d0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
90e0: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
90f0: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
9100: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
9110: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
9120: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
9130: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
9140: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9150: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
9160: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
9170: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
9180: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
9190: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
91a0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
91b0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
91c0: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
91d0: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
91e0: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
91f0: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
9200: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
9210: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
9220: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9230: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
9240: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
9250: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
9260: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9270: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
9280: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
9290: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
92a0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
92b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
92c0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
92d0: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
92e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
92f0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
9300: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
9310: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
9320: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
9330: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
9340: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
9350: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
9360: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9370: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
9380: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
9390: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
93a0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
93b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
93c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
93d0: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
93e0: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
93f0: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9410: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9420: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9430: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
9440: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
9450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9460: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
9470: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
9480: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
9490: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
94a0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
94b0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
94c0: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
94d0: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
94e0: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
94f0: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
9500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9510: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
9520: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
9530: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
9540: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
9550: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9560: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9570: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9580: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
9590: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
95a0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
95b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
95c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
95d0: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
95e0: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
95f0: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
9600: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9610: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
9620: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
9630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
9640: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
9650: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
9660: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9670: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
9680: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
9690: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
96a0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
96b0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
96c0: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
96d0: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
96e0: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
96f0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
9700: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
9720: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
9730: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
9740: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9750: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
9760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9770: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9780: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9790: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
97a0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
97b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
97c0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
97d0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
97e0: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
97f0: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
9800: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
9810: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
9820: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9830: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
9840: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
9850: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9860: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
9870: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
9880: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9890: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
98a0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
98b0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
98c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
98d0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
98e0: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
98f0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
9900: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
9910: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
9920: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
9930: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
9940: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
9950: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
9960: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
9970: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9980: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
9990: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
99a0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
99b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
99c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
99d0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
99e0: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
99f0: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
9a00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
9a10: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
9a20: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
9a30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9a40: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
9a50: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
9a60: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
9a70: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
9a80: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
9a90: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
9aa0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
9ab0: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
9ac0: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
9ad0: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
9ae0: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
9af0: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
9b00: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
9b10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9b20: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
9b30: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9b40: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
9b50: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
9b60: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
9b70: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
9b80: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
9b90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9ba0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
9bb0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9bc0: 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ndf(p, "%d", pEx
9bd0: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
9be0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9bf0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9c10: 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c  appendf(p, "NULL
9c20: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
9c30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
9c40: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
9c50: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
9c60: 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  df(p, "r[%d]", p
9c70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
9c80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
9ca0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
9cb0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9cc0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
9cd0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
9ce0: 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  f(p, "rowid");. 
9cf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9d10: 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22  appendf(p, "c%d"
9d20: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
9d30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
9d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9d50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
9d60: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
9d70: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9d80: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
9d90: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
9da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9db0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
9dc0: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
9dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9de0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
9df0: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
9e00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9e10: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
9e20: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
9e30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e40: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
9e50: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
9e60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
9e70: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
9e80: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9e90: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
9ea0: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
9eb0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9ec0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
9ed0: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ef0: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
9f00: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
9f10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9f20: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
9f30: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
9f40: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
9f50: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
9f60: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
9f70: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
9f80: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
9f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fa0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
9fb0: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
9fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9fd0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
9fe0: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
9ff0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a000: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
a010: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
a020: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
a030: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
a040: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
a050: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
a060: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
a070: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
a080: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
a090: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
a0a0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
a0b0: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
a0c0: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
a0d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a0e0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
a0f0: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
a100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a110: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
a120: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
a130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a140: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
a150: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
a160: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
a170: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
a180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a190: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
a1a0: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
a1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a1c0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
a1d0: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
a1e0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
a1f0: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
a200: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a210: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
a220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a230: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
a240: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a250: 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20  pendf(p, "%s(", 
a260: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
a270: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
a280: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
a290: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
a2a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a2b0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a2c0: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
a2d0: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
a2e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a2f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a300: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a310: 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  )", 1);.  }.}.#e
a320: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a330: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
a340: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
a350: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a  _CURSOR_HINTS) *
a360: 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  /...#if VDBE_DIS
a370: 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f  PLAY_P4./*.** Co
a380: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
a390: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
a3a0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
a3b0: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
a3c0: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
a3d0: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
a3e0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
a3f0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
a400: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
a410: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
a420: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
a430: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
a440: 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  emp;.  StrAccum 
a450: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  x;.  assert( nTe
a460: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69  mp>=20 );.  sqli
a470: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
a480: 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54  &x, 0, zTemp, nT
a490: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63  emp, 0);.  switc
a4a0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
a4b0: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
a4c0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
a4d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  nt j;.      KeyI
a4e0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
a4f0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
a500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a510: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
a520: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
a530: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a540: 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  endf(&x, "k(%d",
a550: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
a560: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
a570: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
a580: 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b  ->nKeyField; j++
a590: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
a5a0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
a5b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
a5c0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a5d0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
a5e0: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
a5f0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
a600: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
a610: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
a620: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
a630: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a640: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
a650: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
a660: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
a670: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20  aSortOrder[j] ? 
a680: 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29  "-" : "", zColl)
a690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a6a0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a6b0: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
a6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6d0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a6e0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
a6f0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
a700: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
a710: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
a720: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
a730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a740: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
a750: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
a760: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
a770: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
a780: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
a790: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a7a0: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
a7b0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
a7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
a7e0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
a7f0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
a800: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
a810: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a820: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
a830: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
a840: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
a850: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a860: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
a870: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
a880: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
a890: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
a8a0: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
a8b0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
a8c0: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
a8d0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
a8e0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a8f0: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
a900: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
a910: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
a920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
a930: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
a940: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
a950: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a960: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
a970: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
a980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a990: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
a9a0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
a9b0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a9c0: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
a9d0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
a9e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a9f0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
aa00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
aa10: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
aa20: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
aa30: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
aa40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
aa50: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
aa60: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
aa70: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
aa80: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
aa90: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
aaa0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
aab0: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
aac0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
aad0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
aae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aaf0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
ab00: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
ab10: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
ab20: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
ab30: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
ab40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
ab50: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
ab60: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
ab70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ab80: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
ab90: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
aba0: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
abb0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
abc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
abe0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
abf0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
ac00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ac10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ac20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ac30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ac40: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
ac50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ac60: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
ac70: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
ac80: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
ac90: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
aca0: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
acb0: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
acc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
acd0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
ace0: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
acf0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
ad00: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
ad10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
ad20: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
ad30: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
ad40: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
ad50: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
ad80: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
ad90: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
ada0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
adb0: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <=n; i++){.     
adc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
add0: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22  ppendf(&x, ",%d"
ade0: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
adf0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
ae00: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
ae10: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
ae20: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
ae30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ae40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
ae50: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
ae60: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ae70: 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61  endf(&x, "progra
ae80: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
ae90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aea0: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
aeb0: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
aec0: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
aed0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
aee0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
aef0: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
af10: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
af20: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
af30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
af40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
af50: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
af60: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
af70: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
af80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
af90: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
afa0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
afb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
afc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
afd0: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
afe0: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
aff0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
b000: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
b010: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
b020: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
b030: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
b040: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
b050: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
b060: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
b070: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
b080: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
b090: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
b0a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
b0b0: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
b0c0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
b0d0: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
b0e0: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
b0f0: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
b100: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
b110: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
b120: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
b130: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
b140: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
b150: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
b160: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
b170: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
b180: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
b190: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
b1a0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
b1b0: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
b1c0: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
b1d0: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
b1e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
b1f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
b200: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
b210: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
b220: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
b230: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
b240: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
b250: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
b260: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
b270: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
b280: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
b290: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b2a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
b2b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
b2c0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
b2d0: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
b2e0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
b2f0: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
b300: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
b310: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
b320: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
b330: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
b340: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
b350: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
b360: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
b370: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
b380: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
b390: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
b3a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
b3b0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
b3c0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
b3d0: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
b3e0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
b3f0: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
b400: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
b410: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
b420: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
b430: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
b440: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
b450: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
b460: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
b470: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
b480: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
b490: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
b4a0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
b4b0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
b4c0: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
b4d0: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
b4e0: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
b4f0: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
b500: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b510: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
b520: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
b530: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
b540: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
b550: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
b560: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
b570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b580: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
b590: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
b5a0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
b5b0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
b5c0: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
b5d0: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
b5e0: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
b5f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
b600: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
b610: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
b620: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
b630: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
b640: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
b650: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
b660: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
b670: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
b680: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
b690: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
b6a0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
b6b0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
b6c0: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
b6d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
b6e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b6f0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
b700: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
b710: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
b720: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
b730: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
b740: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
b750: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
b760: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
b770: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
b780: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
b790: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
b7a0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
b7b0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
b7c0: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
b7d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b7e0: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
b7f0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
b800: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
b810: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b820: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b830: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
b840: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
b850: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
b860: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
b870: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
b880: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b890: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
b8a0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
b8b0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
b8c0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
b8d0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
b8e0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
b8f0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
b900: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
b910: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
b920: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
b930: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
b940: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
b950: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
b960: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
b970: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
b980: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
b990: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b9a0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
b9b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
b9c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
b9d0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
b9e0: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
b9f0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
ba00: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
ba10: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
ba20: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
ba30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
ba40: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
ba50: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
ba60: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
ba70: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
ba80: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
ba90: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
baa0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
bab0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
bac0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
bad0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
bae0: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
baf0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
bb00: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
bb10: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
bb20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
bb30: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
bb40: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
bb50: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
bb60: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
bb70: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
bb80: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
bb90: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
bba0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
bbb0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
bbc0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
bbd0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
bbe0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
bbf0: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
bc00: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
bc10: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
bc20: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
bc30: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
bc40: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
bc50: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
bc60: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
bc70: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
bc80: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
bc90: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
bca0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
bcb0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
bcc0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
bcd0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
bce0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
bcf0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
bd00: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
bd10: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
bd20: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
bd30: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
bd40: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
bd50: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
bd60: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
bd70: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
bd80: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
bd90: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
bda0: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   element..*/.sta
bdb0: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d  tic void initMem
bdc0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
bdd0: 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t N, sqlite3 *db
bde0: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
bdf0: 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29  while( (N--)>0 )
be00: 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  {.    p->db = db
be10: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
be20: 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73   flags;.    p->s
be30: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66  zMalloc = 0;.#if
be40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
be50: 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72  .    p->pScopyFr
be60: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
be70: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f     p++;.  }.}../
be80: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
be90: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
bea0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
beb0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
bec0: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
bed0: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
bee0: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
bef0: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
bf00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bf10: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
bf20: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
bf30: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
bf40: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
bf50: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
bf60: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
bf70: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
bf80: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
bf90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
bfa0: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
bfb0: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
bfc0: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
bfd0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
bfe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
bff0: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
c000: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
c010: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
c020: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
c030: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
c040: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
c050: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
c060: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
c070: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
c080: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
c090: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
c0a0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
c0b0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
c0c0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
c0d0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
c0e0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
c0f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
c100: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
c110: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
c120: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
c130: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
c140: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
c150: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
c160: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
c170: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
c180: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
c190: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
c1a0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
c1b0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
c1c0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
c1d0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
c1e0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
c1f0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
c200: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
c210: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
c220: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
c230: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
c240: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
c250: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
c260: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
c270: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
c280: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
c290: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
c2a0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
c2b0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
c2c0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
c2d0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
c2e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
c2f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
c300: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
c310: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c320: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
c330: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
c340: 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d  stcase( p->xDel=
c350: 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d  =sqlite3VdbeFram
c360: 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20  eMemDel );.     
c370: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
c380: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
c390: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
c3a0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
c3b0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 52 6f 77 53  MEM_Dyn|MEM_RowS
c3c0: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
c3d0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
c3e0: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
c3f0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61  else if( p->szMa
c400: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
c410: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
c420: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
c430: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61  .        p->szMa
c440: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
c450: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
c460: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
c470: 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  d;.    }while( (
c480: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  ++p)<pEnd );.  }
c490: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
c4a0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65  E_DEBUG./*.** Ve
c4b0: 72 69 66 79 20 74 68 61 74 20 70 46 72 61 6d 65  rify that pFrame
c4c0: 20 69 73 20 61 20 76 61 6c 69 64 20 56 64 62 65   is a valid Vdbe
c4d0: 46 72 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20  Frame pointer.  
c4e0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
c4f0: 74 20 69 73 0a 2a 2a 20 61 6e 64 20 66 61 6c 73  t is.** and fals
c500: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 69  e if something i
c510: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  s wrong..**.** T
c520: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
c530: 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20  ntended for use 
c540: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
c550: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  () statements on
c560: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
c570: 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c  e3VdbeFrameIsVal
c580: 69 64 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  id(VdbeFrame *pF
c590: 72 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 46 72  rame){.  if( pFr
c5a0: 61 6d 65 2d 3e 69 46 72 61 6d 65 4d 61 67 69 63  ame->iFrameMagic
c5b0: 21 3d 53 51 4c 49 54 45 5f 46 52 41 4d 45 5f 4d  !=SQLITE_FRAME_M
c5c0: 41 47 49 43 20 29 20 72 65 74 75 72 6e 20 30 3b  AGIC ) return 0;
c5d0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
c5e0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
c5f0: 69 73 20 69 73 20 61 20 64 65 73 74 72 75 63 74  is is a destruct
c600: 6f 72 20 6f 6e 20 61 20 4d 65 6d 20 6f 62 6a 65  or on a Mem obje
c610: 63 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  ct (which is rea
c620: 6c 6c 79 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  lly an sqlite3_v
c630: 61 6c 75 65 29 0a 2a 2a 20 74 68 61 74 20 64 65  alue).** that de
c640: 6c 65 74 65 73 20 74 68 65 20 46 72 61 6d 65 20  letes the Frame 
c650: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61  object that is a
c660: 74 74 61 63 68 65 64 20 74 6f 20 69 74 20 61 73  ttached to it as
c670: 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54   a blob..**.** T
c680: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
c690: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
c6a0: 46 72 61 6d 65 20 72 69 67 68 74 20 61 77 61 79  Frame right away
c6b0: 2e 20 20 49 74 20 6d 65 72 65 6c 79 20 61 64 64  .  It merely add
c6c0: 73 20 74 68 65 0a 2a 2a 20 66 72 61 6d 65 20 74  s the.** frame t
c6d0: 6f 20 61 20 6c 69 73 74 20 6f 66 20 66 72 61 6d  o a list of fram
c6e0: 65 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  es to be deleted
c6f0: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 68   when the Vdbe h
c700: 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  alts..*/.void sq
c710: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 4d 65  lite3VdbeFrameMe
c720: 6d 44 65 6c 28 76 6f 69 64 20 2a 70 41 72 67 29  mDel(void *pArg)
c730: 7b 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  {.  VdbeFrame *p
c740: 46 72 61 6d 65 20 3d 20 28 56 64 62 65 46 72 61  Frame = (VdbeFra
c750: 6d 65 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  me*)pArg;.  asse
c760: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 46  rt( sqlite3VdbeF
c770: 72 61 6d 65 49 73 56 61 6c 69 64 28 70 46 72 61  rameIsValid(pFra
c780: 6d 65 29 20 29 3b 0a 20 20 70 46 72 61 6d 65 2d  me) );.  pFrame-
c790: 3e 70 50 61 72 65 6e 74 20 3d 20 70 46 72 61 6d  >pParent = pFram
c7a0: 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 3b  e->v->pDelFrame;
c7b0: 0a 20 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44  .  pFrame->v->pD
c7c0: 65 6c 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65  elFrame = pFrame
c7d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ;.}.../*.** Dele
c7e0: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
c7f0: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
c800: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
c810: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
c820: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
c830: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
c840: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
c850: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
c860: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
c870: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
c880: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
c890: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
c8a0: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
c8b0: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
c8c0: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
c8d0: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
c8e0: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 61 73 73  ChildMem];.  ass
c8f0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
c900: 46 72 61 6d 65 49 73 56 61 6c 69 64 28 70 29 20  FrameIsValid(p) 
c910: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
c920: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
c930: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
c940: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
c950: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
c960: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
c970: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
c980: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
c990: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
c9a0: 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26  Data(p->v->db, &
c9b0: 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
c9c0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   0);.  sqlite3Db
c9d0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
c9e0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
c9f0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
ca00: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
ca10: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
ca20: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
ca30: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
ca40: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
ca50: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
ca60: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
ca70: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
ca80: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
ca90: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
caa0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
cab0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
cac0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
cad0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
cae0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
caf0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
cb00: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
cb10: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
cb20: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
cb30: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
cb40: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
cb50: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
cb60: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
cb70: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
cb80: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
cb90: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
cba0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
cbb0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
cbc0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
cbd0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30  UERY PLAN..** 20
cbe0: 31 38 2d 30 34 2d 32 34 3a 20 20 49 6e 20 70 2d  18-04-24:  In p-
cbf0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65  >explain==2 mode
cc00: 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70  , the OP_Init op
cc10: 63 6f 64 65 73 20 6f 66 20 74 72 69 67 67 65 72  codes of trigger
cc20: 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 73 68  s.** are also sh
cc30: 6f 77 6e 2c 20 73 6f 20 74 68 61 74 20 74 68 65  own, so that the
cc40: 20 62 6f 75 6e 64 61 72 69 65 73 20 62 65 74 77   boundaries betw
cc50: 65 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  een the main pro
cc60: 67 72 61 6d 20 61 6e 64 0a 2a 2a 20 65 61 63 68  gram and.** each
cc70: 20 74 72 69 67 67 65 72 20 61 72 65 20 63 6c 65   trigger are cle
cc80: 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  ar..**.** When p
cc90: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
cca0: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
ccb0: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
ccc0: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
ccd0: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
cce0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
ccf0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
cd00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
cd10: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
cd40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cd70: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
cd80: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
cd90: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
cda0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
cdb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cdc0: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
cdd0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
cde0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
cdf0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
ce00: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
ce10: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
ce20: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
ce50: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
ce60: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
ce70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ce80: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
ce90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
cea0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ceb0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
cee0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cef0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
cf00: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
cf10: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cf20: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
cf30: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
cf40: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
cf50: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
cf60: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
cf70: 6e 74 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73  nt bListSubprogs
cf80: 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   = (p->explain==
cf90: 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20  1 || (db->flags 
cfa0: 26 20 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72  & SQLITE_Trigger
cfb0: 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f 70 20 2a  EQP)!=0);.  Op *
cfc0: 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  pOp = 0;..  asse
cfd0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
cfe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
cff0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
d000: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
d010: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d020: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
d030: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
d040: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
d050: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
d060: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
d070: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
d080: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
d090: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
d0a0: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
d0b0: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
d0c0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
d0d0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
d0e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
d0f0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
d100: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
d110: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
d120: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
d130: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
d140: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
d150: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
d160: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
d170: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
d180: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
d190: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
d1a0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
d1b0: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
d1c0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
d1d0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
d1e0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71  iled.  */.    sq
d1f0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
d200: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
d210: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
d220: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
d230: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
d240: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
d250: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
d260: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
d270: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
d280: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
d290: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
d2a0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
d2b0: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
d2c0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d2d0: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
d2e0: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
d2f0: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
d300: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
d310: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
d320: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
d330: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
d340: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
d350: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
d360: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
d370: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
d380: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
d390: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
d3a0: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
d3b0: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
d3c0: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
d3d0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 62 4c 69  ->nOp;.  if( bLi
d3e0: 73 74 53 75 62 70 72 6f 67 73 20 29 7b 0a 20 20  stSubprogs ){.  
d3f0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
d400: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
d410: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
d420: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
d430: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
d440: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
d450: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
d460: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
d470: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
d480: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
d490: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
d4a0: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
d4b0: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
d4c0: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
d4d0: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
d4e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
d4f0: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
d500: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
d510: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
d520: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
d530: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
d540: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
d550: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
d560: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
d570: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
d580: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
d590: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
d5a0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
d5b0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
d5c0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
d5d0: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
d5e0: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
d5f0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
d600: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
d610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
d620: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
d630: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
d640: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
d650: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69      }.  }..  whi
d660: 6c 65 28 31 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20  le(1){  /* Loop 
d670: 65 78 69 74 73 20 76 69 61 20 62 72 65 61 6b 20  exits via break 
d680: 2a 2f 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  */.    i = p->pc
d690: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  ++;.    if( i>=n
d6a0: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
d6b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d6c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d6d0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 62 72  E_DONE;.      br
d6e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
d6f0: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
d700: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
d710: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
d720: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
d730: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
d740: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
d750: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
d760: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
d770: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
d780: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
d790: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
d7a0: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
d7b0: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
d7c0: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
d7d0: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
d7e0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
d7f0: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
d800: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
d810: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
d820: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
d830: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
d840: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
d850: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
d860: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
d870: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
d880: 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  i];.    }..    /
d890: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
d8a0: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
d8b0: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
d8c0: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
d8d0: 61 73 0a 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  as.    ** a P4_S
d8e0: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
d8f0: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
d900: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
d910: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
d920: 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20  .    ** kept in 
d930: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
d940: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
d950: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
d960: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
d970: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
d980: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
d990: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d9a0: 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 26   bListSubprogs &
d9b0: 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  & pOp->p4type==P
d9c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
d9d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
d9e0: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
d9f0: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
da00: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
da10: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
da20: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
da30: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
da40: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
da50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
da60: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
da70: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
da80: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64  ->rc = sqlite3Vd
da90: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
daa0: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 3b  nByte, nSub!=0);
dab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
dac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dad0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
dae0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
daf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
db00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
db10: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
db20: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
db30: 0a 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e  .        apSub[n
db40: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
db50: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
db60: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
db70: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
db80: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
db90: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
dba0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
dbb0: 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e  nRow += pOp->p4.
dbc0: 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20  pProgram->nOp;. 
dbd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dbe0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3c   if( p->explain<
dbf0: 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  2 ) break;.    i
dc00: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
dc10: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 20 62 72 65  OP_Explain ) bre
dc20: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ak;.    if( pOp-
dc30: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
dc40: 20 26 26 20 70 2d 3e 70 63 3e 31 20 29 20 62 72   && p->pc>1 ) br
dc50: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
dc60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dc70: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  .    if( db->u1.
dc80: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
dc90: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
dca0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
dcb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
dcc0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
dcd0: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
dce0: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
dcf0: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 20 20 7d  r(p->rc));.    }
dd00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
dd10: 20 2a 7a 50 34 3b 0a 20 20 20 20 20 20 69 66 28   *zP4;.      if(
dd20: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
dd30: 7b 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 49 6e 74 3b  flags = MEM_Int;
dd50: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  .        pMem->u
dd60: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
dd90: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
dda0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
ddb0: 20 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e   .        pMem->
ddc0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
ddd0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
dde0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
ddf0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
de00: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
de10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
de20: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
de30: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
de40: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >z!=0 );.       
de50: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
de60: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
de70: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
de80: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
de90: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
dea0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  em++;.      }.. 
deb0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
dec0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
ded0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
dee0: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20 70  /* P1 */.      p
df10: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d  Mem++;..      pM
df20: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
df30: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
df40: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
df70: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
df80: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
df90: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
dfa0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
dfb0: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
dfe0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
dff0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
e000: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
e010: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
e020: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P4 */.        
e030: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
e040: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e050: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e060: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e070: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
e080: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
e090: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
e0a0: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
e0b0: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d  pOp, pMem->z, pM
e0c0: 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  em->szMalloc);. 
e0d0: 20 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d       if( zP4!=pM
e0e0: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20  em->z ){.       
e0f0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20   pMem->n = 0;.  
e100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e110: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
e120: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
e130: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20  _UTF8, 0);.     
e140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e150: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
e160: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  =0 );.        pM
e170: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
e180: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
e190: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e1a0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
e1b0: 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  8;.      }.     
e1c0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
e1d0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
e1e0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  1 ){.        if(
e1f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
e200: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
e210: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
e220: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
e230: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e240: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
e250: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e270: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e280: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
e290: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
e2a0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ->n = 2;.       
e2b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e2c0: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
e2d0: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
e2e0: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
e2f0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
e300: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
e310: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
e320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e330: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
e340: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 20 20 69  MMENTS.        i
e350: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
e360: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
e370: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
e380: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e390: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
e3a0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  led );.         
e3b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
e3c0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
e3d0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
e3e0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
e3f0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
e400: 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61  pMem->n = displa
e410: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
e420: 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29  4, pMem->z, 500)
e430: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e440: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
e450: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  8;.#else.       
e460: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e470: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e490: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
e4a0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  dif.      }..   
e4b0: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
e4c0: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
e4d0: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 20 20 70  lain-1);.      p
e4e0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
e4f0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
e500: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
e510: 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _OK;.      rc = 
e520: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20  SQLITE_ROW;.    
e530: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e540: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
e550: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
e560: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
e570: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
e580: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
e590: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
e5a0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
e5b0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
e5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
e5d0: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
e5e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
e5f0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
e600: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
e610: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
e620: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
e630: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
e640: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
e650: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
e660: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
e670: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
e680: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
e690: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
e6a0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
e6b0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
e6c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
e6d0: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
e6e0: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
e6f0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
e700: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e710: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
e720: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
e730: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
e740: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
e750: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
e760: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
e770: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
e780: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
e790: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
e7a0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
e7b0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
e7c0: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
e7d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
e7e0: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
e7f0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
e800: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
e810: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
e820: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
e830: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
e840: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
e850: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
e860: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
e870: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
e880: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
e890: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
e8a0: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
e8b0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
e8c0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
e8d0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
e8e0: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
e8f0: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
e900: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
e910: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
e920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
e940: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
e950: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
e960: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
e970: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
e980: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
e990: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
e9a0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
e9b0: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
e9c0: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41  IOTRACE */../* A
e9d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
e9e0: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
e9f0: 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  bes bulk memory 
ea00: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
ea10: 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f  e.** by subcompo
ea20: 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61  nents of a prepa
ea30: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
ea40: 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  Space is allocat
ea50: 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52  ed out.** of a R
ea60: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
ea70: 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63  ect by the alloc
ea80: 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
ea90: 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74  below..*/.struct
eaa0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b   ReusableSpace {
eab0: 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20  .  u8 *pSpace;  
eac0: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c          /* Avail
ead0: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
eae0: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
eaf0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
eb00: 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  f available memo
eb10: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65  ry */.  int nNee
eb20: 64 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ded;         /* 
eb30: 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74  Total bytes that
eb40: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c   could not be al
eb50: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
eb60: 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74  * Try to allocat
eb70: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
eb80: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
eb90: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20  bulk memory for 
eba0: 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  pBuf.** from the
ebb0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
ebc0: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
ebd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
ebe0: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d  allocated.** mem
ebf0: 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ory on success. 
ec00: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
ec10: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
ec20: 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52  able in the.** R
ec30: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
ec40: 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ect, increase th
ec50: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e  e ReusableSpace.
ec60: 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65  nNeeded.** value
ec70: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e   by the amount n
ec80: 65 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eeded and return
ec90: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
eca0: 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74  pBuf is not init
ecb0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74  ially NULL, that
ecc0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
ecd0: 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61  memory has alrea
ece0: 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  dy.** been alloc
ecf0: 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
ed00: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
ed10: 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65  tine, so just re
ed20: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
ed30: 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65  f pBuf and leave
ed40: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75   ReusableSpace u
ed50: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
ed60: 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69  This allocator i
ed70: 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65  s employed to re
ed80: 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73  purpose unused s
ed90: 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20  lots at the end 
eda0: 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  of the.** opcode
edb0: 20 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72   array of prepar
edc0: 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68  ed state for oth
edd0: 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20  er memory needs 
ede0: 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a  of the prepared.
edf0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ** statement..*/
ee00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
ee10: 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75  locSpace(.  stru
ee20: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
ee30: 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65   *p,  /* Bulk me
ee40: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
ee50: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
ee60: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee80: 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69  Pointer to a pri
ee90: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
eea0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eec0: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  Bytes of memory 
eed0: 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  needed */.){.  a
eee0: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
eef0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70  E_ALIGNMENT(p->p
ef00: 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20  Space) );.  if( 
ef10: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  pBuf==0 ){.    n
ef20: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
ef30: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
ef40: 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20  yte <= p->nFree 
ef50: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65  ){.      p->nFre
ef60: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  e -= nByte;.    
ef70: 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70    pBuf = &p->pSp
ef80: 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20  ace[p->nFree];. 
ef90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
efa0: 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42  p->nNeeded += nB
efb0: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  yte;.    }.  }. 
efc0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
efd0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42  YTE_ALIGNMENT(pB
efe0: 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  uf) );.  return 
eff0: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
f000: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
f010: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
f020: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
f030: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
f040: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
f050: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
f060: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
f070: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
f080: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
f090: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
f0a0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
f0b0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
f0c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
f0d0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
f0e0: 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  NIT || p->magic=
f0f0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45  =VDBE_MAGIC_RESE
f100: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
f110: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
f120: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
f130: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
f140: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
f150: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
f160: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
f170: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
f180: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
f190: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
f1a0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
f1b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f1c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f1d0: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
f1e0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
f1f0: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
f200: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
f210: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
f220: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f230: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
f240: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
f250: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
f260: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
f270: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
f280: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
f290: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
f2a0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
f2b0: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
f2c0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
f2d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f2e0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
f2f0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
f300: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
f310: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
f320: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f330: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
f340: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
f350: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
f360: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
f370: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
f380: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f390: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
f3a0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
f3b0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65  as allocating re
f3c0: 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74  gisters and init
f3d0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
f3e0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
f3f0: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
f400: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
f410: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
f420: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
f430: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
f440: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
f450: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
f460: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
f470: 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  lled exactly onc
f480: 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61  e on each virtua
f490: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
f4a0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
f4b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
f4c0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
f4d0: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
f4e0: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
f4f0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
f500: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72  e is called, fur
f510: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
f520: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
f530: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
f540: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
f550: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
f560: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
f570: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
f580: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
f590: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
f5a0: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
f5b0: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
f5c0: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
f5d0: 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
f5e0: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
f5f0: 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
f600: 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
f610: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
f620: 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
f630: 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
f640: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
f650: 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
f660: 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
f670: 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
f680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
f690: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
f6a0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6c0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
f6d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
f700: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
f710: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
f720: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f730: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f740: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
f750: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
f760: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f770: 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
f780: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f7b0: 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
f7c0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
f7d0: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
f7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f7f0: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
f800: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
f810: 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
f820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f830: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
f840: 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
f850: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
f880: 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  nter */.  struct
f890: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 78   ReusableSpace x
f8a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;        /* Reus
f8b0: 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  able bulk memory
f8c0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
f8d0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f8e0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
f8f0: 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
f900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
f910: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
f920: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
f930: 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e  ert( pParse==p->
f940: 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d  pParse );.  db =
f950: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
f960: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f970: 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
f980: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
f990: 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
f9a0: 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
f9b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
f9c0: 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
f9d0: 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20  ->nMaxArg;.  .  
f9e0: 2f 2a 20 45 61 63 68 20 63 75 72 73 6f 72 20 75  /* Each cursor u
f9f0: 73 65 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ses a memory cel
fa00: 6c 2e 20 20 54 68 65 20 66 69 72 73 74 20 63 75  l.  The first cu
fa10: 72 73 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20  rsor (cursor 0) 
fa20: 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65  can.  ** use aMe
fa30: 6d 5b 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f  m[0] which is no
fa40: 74 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 64  t otherwise used
fa50: 20 62 79 20 74 68 65 20 56 44 42 45 20 70 72 6f   by the VDBE pro
fa60: 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a  gram.  Allocate.
fa70: 20 20 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68    ** space at th
fa80: 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20  e end of aMem[] 
fa90: 66 6f 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e  for cursors 1 an
faa0: 64 20 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20  d greater..  ** 
fab0: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
fac0: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
fad0: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
fae0: 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f  or;.  if( nCurso
faf0: 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29  r==0 && nMem>0 )
fb00: 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61   nMem++;  /* Spa
fb10: 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65  ce for aMem[0] e
fb20: 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20  ven if not used 
fb30: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
fb40: 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75  out how much reu
fb50: 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20  sable memory is 
fb60: 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65  available at the
fb70: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a   end of the.  **
fb80: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
fb90: 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72  This extra memor
fba0: 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f  y will be reallo
fbb0: 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20  cated for other 
fbc0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  elements.  ** of
fbd0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
fbe0: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
fbf0: 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  n = ROUND8(sizeo
fc00: 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20  f(Op)*p->nOp);  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
fc20: 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d  ytes of opcode m
fc30: 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20  emory used */.  
fc40: 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28 75 38  x.pSpace = &((u8
fc50: 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20  *)p->aOp)[n];   
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
fc70: 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d  nused opcode mem
fc80: 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
fc90: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
fca0: 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20  NMENT(x.pSpace) 
fcb0: 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52  );.  x.nFree = R
fcc0: 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65  OUNDDOWN8(pParse
fcd0: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29  ->szOpAlloc - n)
fce0: 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75  ;  /* Bytes of u
fcf0: 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  nused memory */.
fd00: 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65    assert( x.nFre
fd10: 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e>=0 );.  assert
fd20: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
fd30: 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65  GNMENT(&x.pSpace
fd40: 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20  [x.nFree]) );.. 
fd50: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
fd60: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
fd70: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
fd80: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
fd90: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
fda0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
fdb0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
fdc0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
fdd0: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
fde0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65  = 10;.  }.  p->e
fdf0: 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  xpired = 0;..  /
fe00: 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
fe10: 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
fe20: 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
fe30: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
fe40: 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a   one or two.  **
fe50: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
fe60: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
fe70: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
fe80: 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  sed memory at th
fe90: 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
fea0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
feb0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
fec0: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
fed0: 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
fee0: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
fef0: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
ff00: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
ff10: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
ff20: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
ff30: 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
ff40: 72 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  r using a fresh 
ff50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
ff60: 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
ff70: 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
ff80: 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
ff90: 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
ffa0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
ffb0: 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
ffc0: 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  ver memory at th
ffd0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
ffe0: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
fff0: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
10000 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
10010 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
10020 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
10030 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10040 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
10050 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b    x.nNeeded = 0;
10060 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61  .    p->aMem = a
10070 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
10080 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
10090 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d  of(Mem));.    p-
100a0 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
100b0 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20  ce(&x, p->aVar, 
100c0 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
100d0 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20  );.    p->apArg 
100e0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
100f0 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a   p->apArg, nArg*
10100 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20  sizeof(Mem*));. 
10110 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
10120 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
10130 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
10140 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
10150 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  *));.#ifdef SQLI
10160 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
10170 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d  CANSTATUS.    p-
10180 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
10190 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78  pace(&x, p->anEx
101a0 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
101b0 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
101c0 20 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65      if( x.nNeede
101d0 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
101e0 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e    x.pSpace = p->
101f0 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
10200 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
10210 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20   x.nNeeded);.   
10220 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65   x.nFree = x.nNe
10230 65 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20  eded;.  }while( 
10240 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10250 64 20 29 3b 0a 0a 20 20 70 2d 3e 70 56 4c 69 73  d );..  p->pVLis
10260 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  t = pParse->pVLi
10270 73 74 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 56  st;.  pParse->pV
10280 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e  List =  0;.  p->
10290 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65  explain = pParse
102a0 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28  ->explain;.  if(
102b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
102c0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  d ){.    p->nVar
102d0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75   = 0;.    p->nCu
102e0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rsor = 0;.    p-
102f0 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c  >nMem = 0;.  }el
10300 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73  se{.    p->nCurs
10310 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
10320 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
10330 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69  ar)nVar;.    ini
10340 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  tMemArray(p->aVa
10350 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d  r, nVar, db, MEM
10360 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e  _Null);.    p->n
10370 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20  Mem = nMem;.    
10380 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
10390 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20  aMem, nMem, db, 
103a0 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a  MEM_Undefined);.
103b0 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70      memset(p->ap
103c0 43 73 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a  Csr, 0, nCursor*
103d0 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
103e0 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  r*));.#ifdef SQL
103f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
10400 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 6d  SCANSTATUS.    m
10410 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c  emset(p->anExec,
10420 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f   0, p->nOp*sizeo
10430 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
10440 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
10450 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
10460 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
10470 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
10480 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
10490 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
104a0 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
104b0 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
104c0 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
104d0 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
104e0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
104f0 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
10500 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10510 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e  .  assert( pCx->
10520 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e  pBtx==0 || pCx->
10530 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
10540 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69  E_BTREE );.  swi
10550 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79  tch( pCx->eCurTy
10560 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43  pe ){.    case C
10570 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b  URTYPE_SORTER: {
10580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10590 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
105a0 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20  >db, pCx);.     
105b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
105c0 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42    case CURTYPE_B
105d0 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  TREE: {.      if
105e0 28 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72  ( pCx->isEphemer
105f0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  al ){.        if
10600 28 20 70 43 78 2d 3e 70 42 74 78 20 29 20 73 71  ( pCx->pBtx ) sq
10610 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
10620 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20  pCx->pBtx);.    
10630 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
10640 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
10650 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
10660 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
10670 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  s, by.        **
10680 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
10690 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
106a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
106b0 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
106c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
106d0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
106e0 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70  Cursor(pCx->uc.p
106f0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
10700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10710 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10720 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10730 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55  ABLE.    case CU
10740 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20  RTYPE_VTAB: {.  
10750 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
10760 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d  _cursor *pVCur =
10770 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a   pCx->uc.pVCur;.
10780 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69        const sqli
10790 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
107a0 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74  ule = pVCur->pVt
107b0 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
107c0 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72     assert( pVCur
107d0 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20  ->pVtab->nRef>0 
107e0 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e  );.      pVCur->
107f0 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pVtab->nRef--;. 
10800 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43       pModule->xC
10810 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20  lose(pVCur);.   
10820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10830 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
10840 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
10850 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72  rsors in the cur
10860 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73  rent frame..*/.s
10870 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
10880 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56  CursorsInFrame(V
10890 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
108a0 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
108b0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
108c0 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
108d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
108e0 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
108f0 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
10900 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
10910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
10920 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
10930 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
10940 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
10950 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
10960 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
10970 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
10980 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
10990 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
109a0 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
109b0 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
109c0 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
109d0 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
109e0 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
109f0 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
10a00 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
10a10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10a20 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
10a30 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
10a40 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
10a50 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c   pFrame->v;.  cl
10a60 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
10a70 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  e(v);.#ifdef SQL
10a80 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
10a90 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e  SCANSTATUS.  v->
10aa0 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d  anExec = pFrame-
10ab0 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a  >anExec;.#endif.
10ac0 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
10ad0 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
10ae0 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
10af0 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
10b00 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
10b10 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
10b20 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
10b30 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
10b40 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
10b50 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
10b60 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
10b70 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
10b80 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
10b90 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
10ba0 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d  Change;.  v->db-
10bb0 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
10bc0 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20  e->nDbChange;.  
10bd0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
10be0 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20  eAuxData(v->db, 
10bf0 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &v->pAuxData, -1
10c00 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44  , 0);.  v->pAuxD
10c10 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41  ata = pFrame->pA
10c20 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65  uxData;.  pFrame
10c30 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a  ->pAuxData = 0;.
10c40 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
10c50 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
10c60 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
10c70 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
10c80 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
10c90 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
10ca0 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
10cb0 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
10cc0 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
10cd0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
10ce0 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
10cf0 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
10d00 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
10d10 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
10d20 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
10d30 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
10d40 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
10d50 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
10d60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
10d70 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
10d80 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
10d90 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
10da0 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
10db0 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
10dc0 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
10dd0 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
10de0 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
10df0 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
10e00 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
10e10 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d  (pFrame);.    p-
10e20 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20  >pFrame = 0;.   
10e30 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a   p->nFrame = 0;.
10e40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
10e50 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  >nFrame==0 );.  
10e60 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
10e70 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ame(p);.  if( p-
10e80 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c  >aMem ){.    rel
10e90 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
10ea0 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  aMem, p->nMem);.
10eb0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
10ec0 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20  pDelFrame ){.   
10ed0 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c   VdbeFrame *pDel
10ee0 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b   = p->pDelFrame;
10ef0 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d  .    p->pDelFram
10f00 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e  e = pDel->pParen
10f10 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
10f20 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44  beFrameDelete(pD
10f30 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  el);.  }..  /* D
10f40 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74  elete any auxdat
10f50 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61  a allocations ma
10f60 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a  de by the VM */.
10f70 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74    if( p->pAuxDat
10f80 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44  a ) sqlite3VdbeD
10f90 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e  eleteAuxData(p->
10fa0 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61  db, &p->pAuxData
10fb0 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  , -1, 0);.  asse
10fc0 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d  rt( p->pAuxData=
10fd0 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  =0 );.}../*.** S
10fe0 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
10ff0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
11000 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
11010 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
11020 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
11030 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
11040 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
11050 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
11060 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
11070 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
11080 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
11090 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
110a0 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
110b0 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
110c0 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
110d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
110e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
110f0 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
11100 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
11110 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b  olumn){.  int n;
11120 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11130 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70   p->db;..  if( p
11140 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a  ->nResColumn ){.
11150 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
11160 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
11170 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
11180 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 20 20 73  OLNAME_N);.    s
11190 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
111a0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
111b0 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c   }.  n = nResCol
111c0 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
111d0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
111e0 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
111f0 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
11200 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
11210 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
11220 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
11230 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
11240 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
11250 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28  .  initMemArray(
11260 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20  p->aColName, n, 
11270 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d  db, MEM_Null);.}
11280 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
11290 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
112a0 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
112b0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
112c0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
112d0 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
112e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
112f0 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
11300 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
11310 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
11320 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
11330 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
11340 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
11350 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
11360 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
11370 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
11380 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
11390 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
113a0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
113b0 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
113c0 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
113d0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
113e0 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
113f0 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
11400 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
11410 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
11420 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
11430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
11440 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
11450 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
11480 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
11490 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
114b0 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
114c0 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
114d0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
11500 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
11510 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
11520 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
11530 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11540 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
11550 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
11560 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
11570 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
11580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11590 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
115a0 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
115b0 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
115c0 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
115d0 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
115e0 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
115f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
11600 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
11610 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
11620 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11630 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
11640 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
11650 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
11660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11670 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  M_BKPT;.  }.  as
11680 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
11690 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
116a0 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
116b0 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
116c0 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
116d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
116e0 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
116f0 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
11700 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
11710 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
11720 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
11730 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
11740 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
11750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11760 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
11770 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11780 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
11790 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
117a0 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
117b0 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
117c0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
117d0 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
117e0 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
117f0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
11800 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
11810 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
11820 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
11830 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
11840 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
11850 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
11860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
11870 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
11880 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
11890 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
118a0 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
118b0 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
118c0 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
118d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
118e0 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
118f0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
11900 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
11910 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
11920 6d 69 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20  mit using a.    
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
11940 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
11950 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
11970 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
11980 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11990 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
119a0 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
119b0 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
119c0 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
119d0 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
119e0 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
119f0 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
11a00 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
11a10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
11a20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
11a30 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
11a40 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
11a50 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
11a60 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
11a70 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
11a80 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
11a90 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
11aa0 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
11ab0 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
11ac0 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
11ad0 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
11ae0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
11af0 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
11b00 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
11b10 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
11b20 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
11b30 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
11b40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
11b50 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
11b60 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
11b70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
11b80 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
11b90 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
11ba0 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
11bb0 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
11bc0 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
11bd0 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
11be0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
11bf0 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
11c00 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
11c10 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
11c20 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
11c30 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
11c40 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
11c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
11c60 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
11c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
11c80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
11c90 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
11ca0 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
11cb0 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
11cc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
11cd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
11ce0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
11cf0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11d00 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11d10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
11d20 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
11d30 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  t) ){.      /* W
11d40 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
11d50 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e  database might n
11d60 65 65 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  eed a master jou
11d70 72 6e 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f  rnal depends upo
11d80 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a  n.      ** its j
11d90 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f  ournal mode (amo
11da0 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29  ng other things)
11db0 2e 20 20 54 68 69 73 20 6d 61 74 72 69 78 20 64  .  This matrix d
11dc0 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a  etermines which.
11dd0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
11de0 20 6d 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73   modes use a mas
11df0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
11e00 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a  which do not */.
11e10 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
11e20 73 74 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b  st u8 aMJNeeded[
11e30 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
11e40 20 44 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c   DELETE   */  1,
11e50 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53  .        /* PERS
11e60 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20  IST   */ 1,.    
11e70 20 20 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20      /* OFF      
11e80 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
11e90 2a 20 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31  * TRUNCATE  */ 1
11ea0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  ,.        /* MEM
11eb0 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  ORY    */ 0,.   
11ec0 20 20 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20       /* WAL     
11ed0 20 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a    */ 0.      };.
11ee0 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
11ef0 67 65 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20  ger;   /* Pager 
11f00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11f10 70 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65  pBt */.      nee
11f20 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
11f30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11f40 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
11f50 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
11f60 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
11f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
11f80 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[i].safety_l
11f90 65 76 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43  evel!=PAGER_SYNC
11fa0 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20  HRONOUS_OFF.    
11fb0 20 20 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b     && aMJNeeded[
11fc0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a  sqlite3PagerGetJ
11fd0 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
11fe0 72 29 5d 0a 20 20 20 20 20 20 20 26 26 20 73 71  r)].       && sq
11ff0 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64  lite3PagerIsMemd
12000 62 28 70 50 61 67 65 72 29 3d 3d 30 0a 20 20 20  b(pPager)==0.   
12010 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61     ){ .        a
12020 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20  ssert( i!=1 );. 
12030 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b         nTrans++;
12040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
12050 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12060 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
12070 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
12080 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12090 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
120a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
120b0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
120c0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
120d0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
120e0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
120f0 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
12100 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
12110 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
12120 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
12130 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
12140 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
12150 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
12160 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
12170 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12190 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
121a0 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
121b0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
121c0 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
121d0 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
121e0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
121f0 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
12200 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
12210 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
12220 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
12230 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
12240 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
12250 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
12260 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
12270 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
12280 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
12290 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
122a0 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
122b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
122c0 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
122d0 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
122e0 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
122f0 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
12300 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
12310 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
12320 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
12330 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
12340 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
12350 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
12360 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
12370 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
12380 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
12390 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
123a0 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
123b0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
123c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
123d0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
123e0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
123f0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12400 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
12410 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12420 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12430 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
12440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12450 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
12460 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
12470 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
12480 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
12490 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
124a0 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
124b0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
124c0 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
124d0 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
124e0 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
124f0 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
12500 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
12510 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
12520 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
12530 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
12540 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
12550 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
12560 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
12570 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
12580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
12590 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
125a0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
125b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
125c0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
125d0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
125e0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
125f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12600 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12610 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
12620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12640 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12650 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
12660 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12670 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
12680 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
12690 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
126a0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
126b0 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
126c0 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
126d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
126e0 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
126f0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
12700 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
12710 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
12720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
12730 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
12740 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12750 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
12760 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
12770 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
12780 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
12790 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
127a0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
127b0 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
127c0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
127d0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
127e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
127f0 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
12800 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
12810 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
12820 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
12830 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
12840 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
12850 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
12860 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12870 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
12880 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
12890 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
128a0 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
128b0 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
128c0 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
128d0 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
128e0 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
128f0 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
12900 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
12910 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  BKPT;.    do {. 
12920 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
12930 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
12940 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
12950 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
12960 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
12970 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
12980 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
12990 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
129a0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
129b0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
129c0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
129d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
129e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
129f0 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
12a00 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
12a10 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
12a20 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
12a30 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
12a40 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
12a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
12a60 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
12a70 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
12a80 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
12a90 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
12aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12ab0 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
12ac0 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
12ad0 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
12ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
12b10 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
12b20 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
12b30 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
12b40 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
12b50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12b60 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
12b70 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
12b80 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
12b90 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
12ba0 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
12bb0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
12bc0 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
12bd0 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
12be0 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
12bf0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
12c00 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
12c10 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
12c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
12c30 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
12c40 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
12c50 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
12c60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
12c70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
12c80 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
12c90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12ca0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
12cb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
12cc0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
12cd0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
12ce0 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
12cf0 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
12d00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
12d10 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
12d20 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
12d30 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
12d40 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
12d50 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
12d60 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
12d70 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
12d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
12da0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12db0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
12dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12dd0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
12de0 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
12df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
12e00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12e10 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
12e20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
12e30 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
12e40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
12e50 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
12e60 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
12e70 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
12e80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
12e90 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
12ea0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
12eb0 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
12ec0 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
12ed0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
12ee0 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
12ef0 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
12f00 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
12f10 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
12f20 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
12f30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12f40 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
12f50 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12f60 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12f70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
12f80 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
12f90 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
12fa0 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
12fb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
12fc0 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
12fd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
12fe0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
12ff0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
13000 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
13010 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
13020 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
13030 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
13040 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
13050 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
13060 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
13070 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
13080 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
13090 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
130a0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
130b0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
130c0 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
130d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
130e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
130f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13100 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
13110 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13120 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
13130 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
13140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
13150 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
13160 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
13170 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13180 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13190 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
131a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
131b0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
131c0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
131d0 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
131e0 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
131f0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
13200 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d     */.    if( 0=
13210 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
13220 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
13230 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
13240 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
13250 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
13260 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
13270 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
13280 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
13290 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
132a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
132b0 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
132c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
132d0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
132e0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
132f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13300 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
13310 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13320 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
13330 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
13340 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
13350 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
13360 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
13370 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
13380 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
13390 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
133a0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
133b0 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
133c0 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
133d0 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
133e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
133f0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
13400 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
13410 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
13420 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
13430 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
13440 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
13450 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
13460 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
13470 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
13480 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13490 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
134a0 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
134b0 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
134c0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
134d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
134e0 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
134f0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
13500 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
13510 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
13520 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
13530 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
13540 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
13550 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
13560 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
13570 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13580 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
13590 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
135a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
135b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
135c0 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
135d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
135e0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
135f0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
13600 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
13610 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
13620 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13640 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13650 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
13660 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13670 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
13680 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13690 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
136a0 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
136b0 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
136c0 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
136d0 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
136e0 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
136f0 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
13700 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
13710 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
13720 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
13730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13740 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
13750 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
13760 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13770 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13780 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
13790 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
137a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
137b0 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
137c0 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
137d0 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
137e0 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
137f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
13800 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
13810 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
13820 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
13830 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
13840 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
13850 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
13860 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
13870 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
13880 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
13890 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
138a0 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
138b0 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
138c0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
138d0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
138e0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
138f0 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
13900 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
13910 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
13920 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
13930 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
13940 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
13950 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
13960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
13970 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
13980 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
13990 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
139a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
139b0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
139c0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
139d0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
139e0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
139f0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
13a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
13a10 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
13a20 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
13a30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
13a40 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
13a50 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
13a60 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
13a70 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
13a80 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
13a90 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
13aa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13ab0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
13ac0 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
13ad0 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
13ae0 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
13af0 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
13b00 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
13b10 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
13b20 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
13b30 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
13b40 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
13b50 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
13b60 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
13b70 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
13b80 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
13b90 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
13ba0 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
13bb0 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
13bc0 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
13bd0 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
13be0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
13bf0 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
13c00 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
13c10 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
13c20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
13c30 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
13c40 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
13c50 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
13c60 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
13c70 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
13c80 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
13c90 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
13ca0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13cb0 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
13cc0 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
13cd0 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
13ce0 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
13cf0 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
13d00 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
13d10 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
13d20 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
13d30 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
13d40 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
13d50 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
13d60 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
13d70 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
13d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
13d90 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
13da0 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
13db0 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
13dc0 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
13dd0 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
13de0 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
13df0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
13e00 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
13e10 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
13e20 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
13e30 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
13e40 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
13e50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13e60 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
13e70 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
13e80 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
13e90 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
13ea0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
13eb0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
13ec0 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
13ed0 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
13ee0 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
13ef0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
13f00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
13f10 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
13f20 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
13f30 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
13f40 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
13f50 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
13f60 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
13f70 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
13f80 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
13f90 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73  INE int vdbeClos
13fa0 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
13fb0 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
13fc0 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
13fd0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
13fe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13ff0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
14000 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
14010 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
14020 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  -1;..  assert( e
14030 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
14040 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
14050 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
14070 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
14080 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53  .  assert( p->iS
14090 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
140a0 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
140b0 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
140c0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
140d0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69  Db; i++){ .    i
140e0 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
140f0 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  OK;.    Btree *p
14100 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
14110 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
14120 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
14130 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
14140 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
14150 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
14160 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
14170 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
14180 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
14190 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
141a0 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
141b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
141c0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
141d0 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
141e0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
141f0 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
14200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14220 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14230 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
14240 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74   }.  }.  db->nSt
14250 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e  atement--;.  p->
14260 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
14270 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
14290 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
142a0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
142b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
142c0 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
142d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
142e0 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
142f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14310 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14320 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
14330 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
14340 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
14350 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14360 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
14370 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14380 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
14390 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
143a0 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  re the .  ** dat
143b0 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
143c0 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
143d0 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
143e0 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
143f0 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  en .  ** the sta
14400 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14410 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
14420 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  */.  if( eOp==SA
14430 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14440 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
14450 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
14460 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
14470 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
14480 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
14490 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a  DefImmCons;.  }.
144a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
144b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
144c0 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
144d0 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
144e0 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74    if( p->db->nSt
144f0 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
14500 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
14510 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65  return vdbeClose
14520 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70  Statement(p, eOp
14530 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
14550 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14560 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
14570 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
14580 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
14590 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
145a0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
145b0 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
145c0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
145d0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
145e0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
145f0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
14600 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
14610 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
14620 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
14630 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
14640 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
14650 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
14660 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
14670 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
14680 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
14690 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
146a0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
146b0 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
146c0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
146d0 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
146e0 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
146f0 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
14700 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
14710 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
14720 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
14730 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14740 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
14750 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
14760 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
14770 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
14780 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14790 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
147a0 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
147b0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
147c0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
147d0 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
147e0 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
147f0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
14800 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
14810 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
14820 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
14830 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
14840 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
14850 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14860 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47  Error(p, "FOREIG
14870 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
14880 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
14890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
148a0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
148b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
148c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
148d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
148e0 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
148f0 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
14900 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
14910 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
14920 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
14930 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
14940 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
14950 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
14960 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
14970 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
14980 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
14990 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
149a0 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
149b0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
149c0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
149d0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
149e0 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
149f0 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
14a00 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
14a10 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
14a20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
14a30 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
14a40 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
14a50 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
14a60 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
14a70 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
14a80 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
14a90 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
14aa0 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
14ab0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
14ac0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
14ad0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
14ae0 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
14af0 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
14b00 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
14b10 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
14b20 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
14b30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
14b60 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
14b70 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
14b80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14b90 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
14ba0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
14bb0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
14bc0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
14bd0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
14be0 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
14bf0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
14c00 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
14c10 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
14c20 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
14c30 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
14c40 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
14c50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
14c60 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
14c70 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
14c80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
14c90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
14ca0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
14cb0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
14cc0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
14cd0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
14ce0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
14cf0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
14d00 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
14d10 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
14d20 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
14d30 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
14d40 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
14d50 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14d60 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
14d70 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
14d80 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
14d90 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
14da0 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
14db0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
14dc0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61   */..  if( p->ma
14dd0 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
14de0 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
14df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14e00 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14e10 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
14e20 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
14e30 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
14e40 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
14e50 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  p);.  checkActiv
14e60 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
14e70 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
14e80 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
14e90 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
14ea0 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
14eb0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
14ec0 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
14ed0 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
14ee0 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
14ef0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
14f00 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
14f10 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
14f20 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
14f30 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
14f40 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
14f50 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
14f60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
14f70 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
14f80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
14f90 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
14fa0 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
14fb0 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
14fc0 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
14fd0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
14fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14ff0 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
15000 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
15010 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
15020 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
15030 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
15040 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
15050 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
15060 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
15070 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
150a0 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
150b0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
150c0 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
150d0 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
150e0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
150f0 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
15100 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
15110 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
15120 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
15130 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
15140 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
15150 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
15160 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
15170 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
15180 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
15190 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
151a0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
151b0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
151c0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
151d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
151e0 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
151f0 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
15200 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
15210 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
15220 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
15230 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
15240 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
15250 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
15260 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
15270 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
15280 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
15290 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
152a0 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
152b0 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
152c0 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
152d0 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
152e0 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
152f0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
15300 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
15310 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
15320 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
15330 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
15340 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
15350 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
15360 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
15370 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
15380 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
15390 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
153a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
153b0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
153c0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
153d0 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
153e0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
153f0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
15400 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
15410 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
15420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15430 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
15440 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
15450 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
15460 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
15470 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
15480 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
15490 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
154a0 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
154b0 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
154c0 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
154d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
154e0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
154f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
15500 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
15510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
15520 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
15530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
15540 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
15550 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
15560 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
15570 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15580 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
15590 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
155a0 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
155b0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
155c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
155d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
155e0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
155f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
15600 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
15610 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
15620 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
15630 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
15640 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
15650 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
15660 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
15670 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
15680 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
15690 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
156a0 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
156b0 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
156c0 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
156d0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
156e0 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
156f0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
15700 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
15710 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
15720 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
15730 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
15740 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
15750 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
15760 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
15770 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
15780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
15790 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
157a0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
157b0 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
157c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
157d0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
157e0 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
157f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15800 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
15810 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
15820 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
15830 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15840 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
15850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15860 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
15870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
15890 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
158a0 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
158b0 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
158c0 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
158d0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
158e0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
158f0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
15900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
15910 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
15920 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
15930 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
15940 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
15950 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
15960 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
15970 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
15980 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
15990 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
159a0 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
159b0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
159c0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
159d0 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
159e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
159f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
15a00 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
15a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
15a20 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
15a30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
15a40 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
15a50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
15a60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15a80 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
15a90 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
15aa0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
15ab0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
15ac0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
15ad0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15ae0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
15af0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
15b00 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
15b10 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
15b20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
15b30 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
15b40 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
15b50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
15b60 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
15b70 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
15b80 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
15b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15ba0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
15bb0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
15bc0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
15bd0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
15be0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
15bf0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
15c00 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
15c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
15c20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15c30 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
15c40 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
15c50 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
15c60 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
15c70 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
15c80 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
15c90 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
15ca0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
15cb0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
15cc0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
15cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15ce0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
15cf0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
15d00 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
15d10 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
15d20 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15d30 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15d40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15d50 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
15d60 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15d70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
15d80 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
15d90 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
15da0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
15db0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
15dc0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
15dd0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
15de0 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
15df0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
15e00 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
15e10 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
15e20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
15e30 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
15e40 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
15e50 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
15e60 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
15e70 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
15e80 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
15e90 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
15ea0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
15eb0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
15ec0 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
15ed0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
15ee0 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
15ef0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
15f00 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
15f10 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
15f20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15f30 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
15f40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
15f50 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
15f60 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
15f70 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
15f80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
15f90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15fa0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15fb0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
15fc0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
15fd0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
15fe0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
15ff0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16000 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16010 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
16020 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
16030 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16040 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
16050 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
16060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16070 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
16080 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
16090 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
160a0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
160b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
160c0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
160d0 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
160e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
160f0 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
16100 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
16110 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
16120 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
16130 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
16140 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
16150 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
16160 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
16170 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
16180 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
16190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
161a0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
161b0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
161c0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
161d0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
161e0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
161f0 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
16200 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
16210 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
16220 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
16230 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
16240 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
16250 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
16260 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
16270 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
16280 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
16290 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
162a0 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
162b0 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
162c0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
162d0 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
162e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
162f0 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
16300 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
16310 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
16320 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
16330 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
16340 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
16350 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
16360 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16370 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
16380 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
16390 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
163a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
163b0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
163c0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
163d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
163e0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
163f0 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
16400 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
16410 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
16420 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
16430 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
16440 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
16450 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
16460 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
16470 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
16480 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
16490 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
164a0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
164b0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
164c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
164d0 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
164e0 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
164f0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
16500 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
16510 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
16520 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
16530 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
16540 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
16550 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
16560 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
16570 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
16580 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
16590 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
165a0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
165b0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
165c0 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
165d0 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
165e0 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
165f0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
16600 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
16610 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
16620 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
16630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16640 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
16650 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
16660 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
16670 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
16680 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
16690 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
166a0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
166b0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
166c0 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
166d0 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
166e0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
166f0 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
16700 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
16710 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16720 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
16730 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
16740 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
16750 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
16760 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
16770 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
16780 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
16790 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
167a0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
167b0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
167c0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
167d0 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
167e0 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
167f0 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
16800 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
16810 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
16820 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
16830 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
16840 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
16850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
16860 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
16870 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
16880 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
16890 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
168a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
168b0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
168c0 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
168d0 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73  Malloc--;.  }els
168e0 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29  e if( db->pErr )
168f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
16900 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45  ueSetNull(db->pE
16910 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65  rr);.  }.  db->e
16920 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72  rrCode = rc;.  r
16930 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16940 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16950 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
16960 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
16970 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
16980 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
16990 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
169a0 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
169b0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
169c0 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
169d0 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
169e0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
169f0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
16a00 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
16a10 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
16a20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
16a30 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
16a40 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
16a50 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
16a60 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
16a70 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
16a80 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
16a90 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
16aa0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
16ab0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
16ac0 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
16ad0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16ae0 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
16af0 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
16b00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
16b10 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
16b20 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
16b30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
16b40 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
16b50 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
16b60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
16b70 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
16b80 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
16b90 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
16ba0 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
16bb0 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
16bc0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
16bd0 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
16be0 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
16bf0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
16c00 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
16c10 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
16c20 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
16c30 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
16c40 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
16c50 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
16c60 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
16c70 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
16c80 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
16c90 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
16ca0 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
16cb0 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
16cc0 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
16cd0 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
16ce0 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
16cf0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
16d00 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
16d10 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
16d20 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
16d30 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
16d40 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   i;.#endif..  sq
16d50 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
16d60 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
16d70 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
16d80 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
16d90 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
16da0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
16db0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
16dc0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
16dd0 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
16de0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
16df0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
16e00 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
16e10 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16e20 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
16e30 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
16e40 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
16e50 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
16e60 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
16e70 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
16e80 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
16e90 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
16ea0 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
16eb0 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
16ec0 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
16ed0 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
16ee0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
16ef0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
16f00 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
16f10 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
16f20 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
16f30 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
16f40 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
16f50 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
16f60 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
16f70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16f80 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
16f90 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  p);.    if( p->r
16fa0 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
16fb0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
16fc0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
16fd0 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
16fe0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
16ff0 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
17000 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
17010 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
17020 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
17030 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
17040 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
17050 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
17060 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
17070 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
17080 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
17090 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
170a0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
170b0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
170c0 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
170d0 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
170e0 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
170f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
17100 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
17110 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65  ts and reclaim e
17120 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d  rror message mem
17130 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ory..  */.#ifdef
17140 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
17150 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
17160 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
17170 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
17180 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
17190 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
171a0 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
171b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
171c0 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
171d0 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66  if( p->apCsr ) f
171e0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
171f0 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
17200 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d  t( p->apCsr[i]==
17210 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  0 );.  if( p->aM
17220 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  em ){.    for(i=
17230 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  0; i<p->nMem; i+
17240 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
17250 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
17260 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
17270 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
17280 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
17290 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
172a0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
172b0 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
172c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
172d0 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65  EBUG.  p->nWrite
172e0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
172f0 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
17300 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
17310 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
17320 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
17330 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
17340 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
17350 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
17360 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
17370 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
17380 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17390 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
173a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
173b0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
173c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
173d0 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
173e0 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
173f0 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
17400 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
17410 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
17420 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
17430 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
17440 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
17450 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
17460 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
17470 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
17480 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
17490 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
174a0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
174b0 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
174c0 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
174d0 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
174e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
174f0 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
17500 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
17510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
17520 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
17530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
17540 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
17560 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
17570 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
17580 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
17590 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
175a0 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
175b0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
175c0 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
175d0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
175e0 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
175f0 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
17600 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
17610 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
17620 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
17630 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
17640 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
17650 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
17660 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
17670 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
17680 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
17690 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
176a0 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20  E_MAGIC_RESET;. 
176b0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
176c0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
176d0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
176e0 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
176f0 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
17700 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
17710 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
17720 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
17730 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
17740 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
17750 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
17760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17770 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
17780 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
17790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
177a0 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
177b0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
177c0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
177d0 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
177e0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
177f0 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
17800 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
17810 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
17820 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
17830 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
17840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17850 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
17860 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
17870 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
17880 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
17890 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
178a0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
178b0 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
178c0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
178d0 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
178e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
178f0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
17900 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
17910 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
17920 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
17930 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
17940 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
17950 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
17960 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
17970 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
17980 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
17990 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
179a0 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
179b0 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
179c0 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
179d0 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
179e0 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
179f0 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
17a00 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
17a10 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
17a20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
17a30 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
17a40 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
17a50 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
17a60 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
17a70 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
17a80 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
17a90 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
17aa0 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
17ab0 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73  parameter corres
17ac0 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65  ponds to bit 0 e
17ad0 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tc.)..*/.void sq
17ae0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
17af0 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a  uxData(sqlite3 *
17b00 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70  db, AuxData **pp
17b10 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
17b20 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a  ask){.  while( *
17b30 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
17b40 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
17b50 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
17b60 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41      || (pAux->iA
17b70 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20  uxOp==iOp.      
17b80 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75      && pAux->iAu
17b90 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20  xArg>=0.        
17ba0 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78    && (pAux->iAux
17bb0 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
17bc0 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
17bd0 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20  x->iAuxArg)))). 
17be0 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
17bf0 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78  case( pAux->iAux
17c00 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
17c10 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
17c20 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20  teAux ){.       
17c30 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75   pAux->xDeleteAu
17c40 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  x(pAux->pAux);. 
17c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
17c60 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75   = pAux->pNextAu
17c70 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  x;.      sqlite3
17c80 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29  DbFree(db, pAux)
17c90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17ca0 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
17cb0 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20  extAux;.    }.  
17cc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
17cd0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
17ce0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
17cf0 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
17d00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17d10 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72  t,.** except for
17d20 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20   object itself, 
17d30 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76  which is preserv
17d40 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ed..**.** The di
17d50 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
17d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
17d70 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
17d80 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
17d90 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
17da0 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
17db0 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
17dc0 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
17dd0 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
17de0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17df0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74  tion and frees t
17e00 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  he object itself
17e10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17e20 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
17e30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
17e40 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
17e50 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
17e60 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  xt;.  assert( p-
17e70 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
17e80 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
17e90 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
17ea0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
17eb0 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
17ec0 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
17ed0 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
17ee0 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
17ef0 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
17f00 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
17f10 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
17f20 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
17f30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
17f40 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
17f50 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67    }.  if( p->mag
17f60 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
17f70 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  NIT ){.    relea
17f80 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
17f90 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
17fa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17fb0 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a  db, p->pVList);.
17fc0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17fd0 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
17fe0 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f  .  }.  vdbeFreeO
17ff0 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
18000 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
18010 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18020 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
18030 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18040 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64  , p->zSql);.#ifd
18050 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18060 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
18070 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
18080 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18090 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
180a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
180b0 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
180c0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
180d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
180e0 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
180f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
18100 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18110 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
18120 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18130 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
18140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18150 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
18160 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
18170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18180 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
18190 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
181a0 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
181b0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
181c0 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
181d0 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
181e0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
181f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18200 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
18210 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
18220 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
18230 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
18240 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
18250 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
18260 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
18270 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
18280 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
18290 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
182a0 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  eeNN(db, p);.}..
182b0 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
182c0 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
182d0 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
182e0 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
182f0 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
18300 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
18310 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
18320 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
18330 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
18340 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
18350 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
18360 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
18370 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
18380 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
18390 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
183a0 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
183b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
183c0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
183d0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
183e0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
183f0 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
18400 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
18410 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
18420 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
18430 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
18440 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
18450 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
18460 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
18470 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
18480 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
18490 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
184a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
184b0 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
184c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
184d0 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
184e0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
184f0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
18500 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
18510 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
18520 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
18530 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
18540 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
18550 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18560 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
18570 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
18580 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
18590 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
185a0 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
185b0 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
185c0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
185d0 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
185e0 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
185f0 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
18600 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
18610 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
18620 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
18630 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
18640 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
18650 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
18660 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
18670 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
18680 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
18690 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
186a0 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
186b0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
186c0 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
186d0 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
186e0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
186f0 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
18700 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
18710 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
18720 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
18730 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
18740 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
18750 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
18760 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
18770 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
18780 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18790 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
187a0 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
187b0 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
187c0 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
187d0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
187e0 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
187f0 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
18800 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
18810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18820 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
18830 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
18840 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
18850 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
18860 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
18870 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
18880 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
18890 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
188a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
188b0 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
188c0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
188d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
188e0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
188f0 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( s
18900 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18910 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
18920 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
18930 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
18940 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
18950 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18960 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
18970 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
18980 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
18990 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
189a0 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
189b0 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
189c0 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
189d0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
189e0 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
189f0 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
18a00 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
18a10 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
18a20 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
18a30 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
18a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
18a50 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
18a60 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
18a70 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
18a80 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
18a90 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
18aa0 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
18ab0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
18ac0 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
18ad0 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
18ae0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
18af0 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
18b00 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
18b10 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
18b20 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
18b30 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
18b40 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
18b50 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
18b60 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
18b70 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
18b80 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
18b90 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
18ba0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
18bb0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18bc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18bd0 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
18be0 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
18bf0 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
18c00 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
18c10 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
18c20 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
18c30 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43  E_BTREE || p->eC
18c40 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
18c50 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20  PSEUDO );.  if( 
18c60 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
18c70 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61  o ){.    int iMa
18c80 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  p;.    if( p->aA
18c90 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d  ltMap && (iMap =
18ca0 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70   p->aAltMap[1+*p
18cb0 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20  iCol])>0 ){.    
18cc0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
18cd0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69  ursor;.      *pi
18ce0 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
18cf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18d00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18d10 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
18d20 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
18d30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
18d40 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
18d50 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
18d60 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
18d70 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
18d80 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
18d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
18db0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
18dc0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
18dd0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
18de0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
18df0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
18e00 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
18e10 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
18e20 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
18e30 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
18e40 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
18e50 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
18e60 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
18e70 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
18e80 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
18e90 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
18ea0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
18eb0 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
18ec0 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
18ed0 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
18ee0 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
18ef0 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
18f00 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
18f10 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
18f20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
18f30 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
18f40 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
18f50 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
18f60 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
18f70 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
18f80 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
18f90 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
18fa0 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
18fb0 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
18fc0 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
18fd0 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
18fe0 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
18ff0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
19000 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
19010 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
19020 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
19030 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
19040 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
19050 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
19060 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
19070 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
19080 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
19090 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
190a0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
190b0 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
190c0 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
190d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
190e0 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
190f0 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
19100 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
19110 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
19120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
19130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
19140 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
19160 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
19170 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
19190 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
191a0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
191b0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
191c0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
191d0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
191e0 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
19210 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19220 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
19230 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
19240 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19250 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
19260 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
19270 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
19280 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
19290 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192b0 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
192c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
192d0 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
192e0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
192f0 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
19300 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
19330 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
19340 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
19360 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
19370 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
19380 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
193b0 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
193c0 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
193d0 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
193e0 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
193f0 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
19400 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
19410 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
19420 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
19430 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
19440 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
19450 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
19460 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
19470 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
19480 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
19490 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
194a0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
194b0 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
194c0 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
194d0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
194e0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
194f0 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
19500 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
19510 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
19520 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
19530 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
19540 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
19550 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
19560 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
19570 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
19580 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
19590 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
195a0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
195b0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
195c0 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
195d0 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
195e0 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
195f0 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
19600 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
19610 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
19620 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
19630 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
19640 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
19650 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
19660 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
19670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19680 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
19690 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
196a0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
196b0 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
196c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
196d0 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
196e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196f0 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
19700 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19720 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
19730 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
19740 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
19750 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
19760 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
19770 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
19780 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
19790 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
197a0 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
197b0 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
197c0 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
197d0 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
197e0 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
197f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
19800 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
19810 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
19820 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
19830 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
19840 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19850 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
19860 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
19870 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
19880 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
19890 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
198a0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
198b0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
198c0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
198d0 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
198e0 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
198f0 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
19900 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
19910 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
19920 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
19930 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
19940 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
19950 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
19960 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
19970 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
19980 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
19990 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
199a0 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
199b0 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
199c0 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
199d0 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
199e0 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
199f0 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
19a00 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
19a10 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
19a20 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
19a30 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
19a40 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
19a50 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
19a60 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
19a70 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
19a80 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
19a90 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
19aa0 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
19ab0 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
19ac0 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
19ad0 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
19ae0 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
19af0 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
19b00 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
19b10 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
19b20 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
19b30 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
19b40 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
19b50 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
19b60 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
19b70 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
19b80 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
19b90 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
19ba0 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
19bb0 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
19bc0 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
19bd0 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
19be0 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
19bf0 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
19c00 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
19c10 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
19c20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
19c30 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
19c40 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
19c50 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
19c60 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
19c70 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
19c80 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
19c90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19ca0 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
19cb0 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
19cc0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
19cd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
19ce0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
19cf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
19d00 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
19d10 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
19d20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
19d30 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
19d40 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
19d50 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
19d60 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
19d70 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
19d80 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
19d90 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
19da0 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
19db0 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
19dc0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
19dd0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
19de0 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
19df0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
19e00 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
19e10 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
19e20 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
19e30 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
19e40 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
19e50 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
19e60 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
19e70 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
19e80 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
19e90 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
19ea0 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
19eb0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
19ec0 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
19ed0 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
19ee0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
19ef0 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
19f00 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
19f10 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
19f20 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
19f30 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
19f40 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
19f50 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
19f60 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
19f70 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
19f80 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
19f90 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
19fa0 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
19fb0 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
19fc0 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
19fd0 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
19fe0 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
19ff0 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
1a000 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
1a010 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
1a020 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
1a030 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
1a040 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
1a050 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
1a060 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
1a070 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
1a080 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
1a090 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
1a0a0 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
1a0b0 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
1a0c0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
1a0d0 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
1a0e0 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
1a0f0 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
1a100 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
1a110 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
1a120 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
1a130 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
1a140 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
1a150 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
1a160 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
1a170 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
1a180 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1a190 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
1a1a0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1a1b0 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
1a1c0 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
1a1d0 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
1a1e0 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
1a1f0 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
1a200 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
1a210 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
1a220 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
1a230 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
1a240 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
1a250 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
1a260 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
1a270 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
1a280 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
1a290 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
1a2a0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
1a2b0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
1a2c0 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
1a2d0 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
1a2e0 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
1a2f0 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
1a300 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
1a310 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
1a320 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
1a330 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1a340 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
1a350 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
1a360 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
1a370 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
1a380 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
1a390 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
1a3a0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
1a3b0 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
1a3c0 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
1a3d0 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
1a3e0 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
1a3f0 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
1a400 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
1a410 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
1a420 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
1a430 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
1a440 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
1a450 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
1a460 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
1a470 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
1a480 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
1a490 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
1a4a0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1a4b0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1a4c0 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
1a4d0 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
1a4e0 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
1a4f0 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
1a500 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
1a510 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
1a520 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
1a530 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
1a540 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
1a550 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
1a560 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
1a570 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1a580 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
1a590 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
1a5a0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
1a5b0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
1a5c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1a5d0 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
1a5e0 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
1a5f0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
1a600 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
1a610 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
1a620 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1a630 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
1a640 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
1a650 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
1a660 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a670 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
1a680 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
1a690 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
1a6a0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
1a6b0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
1a6c0 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
1a6d0 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
1a6e0 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
1a6f0 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
1a700 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
1a710 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
1a720 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
1a730 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
1a740 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
1a750 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a760 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1a770 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
1a780 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
1a790 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
1a7a0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
1a7b0 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
1a7c0 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
1a7d0 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
1a7e0 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
1a7f0 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
1a800 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
1a810 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
1a820 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
1a830 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
1a840 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
1a850 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
1a860 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
1a870 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1a880 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
1a890 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
1a8a0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
1a8b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1a8c0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
1a8d0 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
1a8e0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1a8f0 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
1a900 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
1a910 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
1a920 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1a930 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
1a940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
1a950 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1a960 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
1a970 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1a980 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1a990 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
1a9a0 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
1a9b0 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
1a9c0 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
1a9d0 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
1a9e0 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
1a9f0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1aa00 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
1aa10 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
1aa20 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1aa30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1aa40 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
1aa50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1aa60 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
1aa70 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
1aa80 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
1aa90 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1aaa0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
1aab0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
1aac0 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
1aad0 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
1aae0 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
1aaf0 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
1ab00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
1ab10 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
1ab20 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
1ab30 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
1ab40 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
1ab50 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
1ab60 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
1ab70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
1ab80 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
1ab90 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
1aba0 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
1abb0 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
1abc0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
1abd0 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
1abe0 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
1abf0 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
1ac00 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
1ac10 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
1ac20 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
1ac30 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
1ac40 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
1ac50 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
1ac60 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1ac70 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
1ac80 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
1ac90 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1aca0 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
1acb0 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
1acc0 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
1acd0 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1ace0 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1acf0 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
1ad00 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
1ad10 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
1ad20 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
1ad30 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
1ad40 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
1ad50 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
1ad60 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
1ad70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ad80 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
1ad90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ada0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1adb0 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
1adc0 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
1add0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
1ade0 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
1adf0 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
1ae00 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
1ae10 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
1ae20 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
1ae30 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
1ae40 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
1ae50 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
1ae60 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
1ae70 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
1ae80 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
1ae90 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
1aea0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1aeb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1aec0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1aed0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1aee0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1aef0 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1af00 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1af10 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1af20 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1af30 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1af40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1af50 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1af60 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1af70 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
1af80 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
1af90 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
1afa0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
1afb0 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
1afc0 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
1afd0 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
1afe0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1aff0 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
1b000 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1b010 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
1b020 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1b030 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1b040 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
1b050 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
1b060 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1b070 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
1b080 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1b090 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1b0a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b0b0 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
1b0c0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1b0d0 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
1b0e0 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
1b0f0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
1b100 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
1b110 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
1b120 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b130 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b140 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
1b150 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
1b160 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
1b170 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
1b180 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1b190 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
1b1a0 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
1b1b0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1b1c0 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
1b1d0 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
1b1e0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
1b1f0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
1b200 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
1b210 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
1b220 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1b230 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
1b240 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
1b250 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
1b260 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
1b270 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
1b280 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
1b290 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1b2a0 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
1b2b0 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
1b2c0 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
1b2d0 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1b2e0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1b2f0 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1b300 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1b310 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1b320 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1b330 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1b340 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1b350 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1b360 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1b370 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1b380 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1b390 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1b3a0 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1b3b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1b3c0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1b3d0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1b3e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b3f0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1b400 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1b410 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1b420 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1b430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b440 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1b450 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1b460 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b480 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1b490 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1b4a0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1b4b0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1b4c0 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a     case 10: { /*
1b4d0 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   Internal use on
1b4e0 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69  ly: NULL with vi
1b4f0 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
1b500 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50             ** UP
1b510 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66  DATE no-change f
1b520 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  lag set */.     
1b530 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1b540 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f  EM_Null|MEM_Zero
1b550 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1b560 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  = 0;.      pMem-
1b570 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20  >u.nZero = 0;.  
1b580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b590 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
1b5a0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1b5b0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1b5c0 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
1b5d0 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
1b5e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1b5f0 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
1b600 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
1b610 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1b620 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
1b630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b640 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
1b650 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1b660 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
1b670 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
1b680 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
1b690 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
1b6a0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1b6b0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
1b6c0 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1b6d0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1b6e0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1b6f0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1b700 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1b710 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1b720 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1b730 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1b740 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1b750 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b760 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
1b770 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1b780 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
1b790 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1b7a0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1b7b0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1b7c0 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1b7d0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1b7e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1b7f0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1b800 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1b810 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
1b820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b830 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1b840 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1b850 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1b860 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
1b870 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
1b880 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
1b890 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1b8a0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1b8b0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1b8c0 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
1b8d0 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1b8e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1b8f0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1b900 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1b910 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1b920 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
1b930 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1b940 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1b950 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1b960 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b970 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
1b980 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1b990 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
1b9a0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1b9b0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1b9c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1b9d0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
1b9e0 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
1b9f0 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
1ba00 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
1ba10 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
1ba20 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
1ba30 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
1ba40 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
1ba50 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
1ba60 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
1ba70 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
1ba80 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
1ba90 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1baa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bab0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1bac0 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
1bad0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1bae0 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1baf0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1bb00 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1bb10 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
1bb20 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
1bb30 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
1bb40 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1bb50 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1bb60 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1bb70 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1bb80 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
1bb90 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1bba0 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1bbb0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1bbc0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1bbd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1bbe0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1bbf0 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
1bc00 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
1bc10 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1bc20 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1bc30 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
1bc40 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
1bc50 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
1bc60 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
1bc70 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
1bc80 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
1bc90 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
1bca0 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
1bcb0 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
1bcc0 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
1bcd0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1bce0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1bcf0 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
1bd00 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
1bd10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bd20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
1bd30 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
1bd40 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
1bd50 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
1bd60 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
1bd70 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
1bd80 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
1bd90 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1bda0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
1bdb0 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
1bdc0 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
1bdd0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1bde0 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
1bdf0 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
1be00 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1be10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1be20 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1be30 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
1be40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
1be50 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
1be60 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
1be70 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
1be80 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
1be90 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
1bea0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
1beb0 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
1bec0 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
1bed0 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1bee0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
1bef0 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
1bf00 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
1bf10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
1bf20 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
1bf30 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
1bf40 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
1bf50 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
1bf60 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
1bf70 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
1bf80 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1bf90 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
1bfa0 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
1bfb0 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
1bfc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
1bfd0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
1bfe0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
1bff0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c000 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
1c010 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
1c020 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
1c030 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
1c040 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
1c050 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
1c060 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
1c070 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
1c080 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
1c090 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1c0a0 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
1c0b0 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
1c0c0 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
1c0d0 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
1c0e0 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
1c0f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1c100 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
1c110 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1c120 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1c130 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1c140 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1c150 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1c160 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1c170 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1c180 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1c190 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1c1a0 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1c1b0 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1c1c0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1c1d0 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1c1e0 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1c1f0 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1c200 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1c210 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1c220 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1c230 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1c240 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1c250 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1c260 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1c270 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1c280 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1c290 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1c2a0 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1c2b0 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1c2c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1c2e0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1c2f0 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  e record */.){. 
1c300 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c310 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1c320 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1c330 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1c340 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c370 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1c380 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65  or *p */.  nByte
1c390 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
1c3a0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1c3b0 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
1c3c0 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  (pKeyInfo->nKeyF
1c3d0 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28  ield+1);.  p = (
1c3e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1c3f0 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1c400 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1c410 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1c420 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1c430 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
1c440 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
1c450 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1c460 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
1c470 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1c480 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1c490 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
1c4a0 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1c4b0 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
1c4c0 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b  nfo->nKeyField +
1c4d0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1c4e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1c4f0 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1c500 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1c510 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1c520 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1c530 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1c540 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1c550 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1c560 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1c570 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1c580 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1c590 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1c5a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1c5b0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1c5c0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1c5d0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1c5e0 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1c5f0 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1c600 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1c610 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c620 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1c630 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1c640 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1c650 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1c660 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1c670 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1c680 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1c690 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1c6a0 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1c6b0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c6c0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1c6d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c6e0 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1c6f0 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c710 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1c720 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1c730 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1c740 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1c750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c760 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c770 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1c780 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1c790 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1c7a0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1c7b0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1c7c0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1c7d0 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1c7e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1c7f0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1c800 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1c810 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1c820 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1c830 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1c840 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1c850 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1c860 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1c870 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1c880 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1c890 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1c8a0 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1c8b0 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1c8c0 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1c8d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1c8e0 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1c8f0 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1c900 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1c910 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d  oc = 0;.    pMem
1c920 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  ->z = 0;.    d +
1c930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1c940 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1c950 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1c960 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1c970 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1c980 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1c990 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
1c9a0 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b   u<=pKeyInfo->nK
1c9b0 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  eyField + 1 );. 
1c9c0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1c9d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1c9e0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
1c9f0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1ca00 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
1ca10 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
1ca20 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
1ca30 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
1ca40 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1ca50 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
1ca60 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
1ca70 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
1ca80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
1ca90 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
1caa0 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
1cab0 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
1cac0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1cad0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
1cae0 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
1caf0 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
1cb00 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
1cb10 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
1cb20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
1cb30 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
1cb40 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
1cb50 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
1cb60 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
1cb70 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
1cb80 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  mitives..**.** R
1cb90 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1cba0 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1cbb0 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61  arison is equiva
1cbc0 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52  lent to desiredR
1cbd0 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  esult..** Return
1cbe0 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20   false if there 
1cbf0 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e  is a disagreemen
1cc00 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1cc10 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1cc20 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e  reDebug(.  int n
1cc30 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1cc40 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1cc50 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1cc60 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1cc70 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74  pPKey2, /* Right
1cc80 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65   key */.  int de
1cc90 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20  siredResult     
1cca0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65          /* Corre
1ccb0 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a  ct answer */.){.
1ccc0 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1ccd0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1cce0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1ccf0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1cd00 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1cd10 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1cd20 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1cd30 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
1cd40 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
1cd50 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
1cd60 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1cd70 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1cd80 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1cd90 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
1cda0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1cdb0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1cdc0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1cdd0 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
1cde0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
1cdf0 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
1ce00 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1ce10 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79  Info;.  if( pKey
1ce20 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65  Info->db==0 ) re
1ce30 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65  turn 1;.  mem1.e
1ce40 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1ce50 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
1ce60 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1ce70 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
1ce80 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
1ce90 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
1cea0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1ceb0 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
1cec0 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1ced0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1cee0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1cef0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1cf00 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
1cf10 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
1cf20 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
1cf30 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
1cf40 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
1cf50 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
1cf60 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
1cf70 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
1cf80 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
1cf90 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
1cfa0 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
1cfb0 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
1cfc0 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
1cfd0 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
1cfe0 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
1cff0 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
1d000 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
1d010 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
1d020 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
1d030 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
1d040 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1d050 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
1d060 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
1d070 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
1d080 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
1d090 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
1d0a0 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
1d0b0 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
1d0c0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
1d0d0 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
1d0e0 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
1d0f0 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
1d100 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
1d110 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
1d120 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1d130 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20   szHdr1);.  if( 
1d140 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72  szHdr1>98307 ) r
1d150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d160 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48  RUPT;.  d1 = szH
1d170 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
1d180 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1d190 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1d1a0 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
1d1b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1d1c0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1d1d0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1d1e0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  t( pKeyInfo->nKe
1d1f0 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  yField>0 );.  as
1d200 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
1d210 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
1d220 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
1d230 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
1d240 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1d250 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
1d260 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
1d270 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
1d280 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
1d290 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
1d2a0 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
1d2b0 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ype1 );..    /* 
1d2c0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72  Verify that ther
1d2d0 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20  e is enough key 
1d2e0 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20  space remaining 
1d2f0 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20  to avoid.    ** 
1d300 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  a buffer overrea
1d310 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69  d.  The "d1+seri
1d320 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65  al_type1+2" sube
1d330 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20  xpression will. 
1d340 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
1d350 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1d360 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f  equal to the amo
1d370 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20  unt of required 
1d380 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  key space..    *
1d390 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f  * Use that appro
1d3a0 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69  ximation to avoi
1d3b0 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e  d the more expen
1d3c0 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20  sive call to.   
1d3d0 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53   ** sqlite3VdbeS
1d3e0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69  erialTypeLen() i
1d3f0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1d400 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d410 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65  ( d1+serial_type
1d420 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20  1+2>(u32)nKey1. 
1d430 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65      && d1+sqlite
1d440 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1d450 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
1d460 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20  >(u32)nKey1 .   
1d470 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1d480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
1d490 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1d4a0 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
1d4b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
1d4c0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1d4d0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1d4e0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
1d4f0 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
1d500 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
1d510 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
1d520 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
1d530 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
1d540 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70  Key2->aMem[i], p
1d550 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1d560 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
1d570 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1d580 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1d590 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1d5a0 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1d5b0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1d5c0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1d5d0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1d5e0 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
1d5f0 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
1d600 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
1d610 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
1d620 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d     goto debugCom
1d630 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20  pareEnd;.    }. 
1d640 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65     i++;.  }while
1d650 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
1d660 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1d670 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  d );..  /* No me
1d680 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1d690 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1d6a0 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1d6b0 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1d6c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1d6d0 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1d6e0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1d6f0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1d700 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1d710 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1d720 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1d730 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
1d740 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1d750 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1d760 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1d770 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1d780 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1d790 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1d7a0 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1d7b0 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1d7c0 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1d7d0 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
1d7e0 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
1d7f0 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  alue.  */.  rc =
1d800 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1d810 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61  _rc;..debugCompa
1d820 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73  reEnd:.  if( des
1d830 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26  iredResult==0 &&
1d840 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   rc==0 ) return 
1d850 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1d860 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30  Result<0 && rc<0
1d870 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1d880 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1d890 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74  >0 && rc>0 ) ret
1d8a0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52  urn 1;.  if( COR
1d8b0 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1d8c0 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   1;.  if( pKeyIn
1d8d0 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1d8e0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1d8f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1d900 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1d910 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1d920 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1d930 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b  r of fields (a.k
1d940 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20  .a. columns) in 
1d950 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
1d960 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79   by.** pKey,nKey
1d970 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68  .  The verify th
1d980 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73  at this count is
1d990 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1d9a0 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69  ual to the.** li
1d9b0 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65  mit given by pKe
1d9c0 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1d9d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1d9e0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1d9f0 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1da00 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1da10 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1da20 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1da30 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1da40 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1da50 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1da60 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1da70 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1da80 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1da90 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1daa0 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1dab0 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46  he KeyInfo.nKeyF
1dac0 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1dad0 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73  nAllField values
1dae0 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1daf0 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1db00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1db10 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1db20 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1db30 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1db40 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1db50 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1db60 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1db70 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1db80 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1db90 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1dba0 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1dbb0 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1dbc0 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1dbd0 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1dbe0 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1dbf0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1dc00 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1dc10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1dc20 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1dc30 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1dc40 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1dc50 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1dc60 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1dc70 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1dc80 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1dc90 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1dca0 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1dcb0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1dcc0 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1dcd0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1dce0 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1dcf0 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1dd00 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1dd10 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ld );.}.#else.# 
1dd20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72  define vdbeAsser
1dd30 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1dd40 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23  nLimits(A,B,C).#
1dd50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  endif../*.** Bot
1dd60 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d  h *pMem1 and *pM
1dd70 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69  em2 contain stri
1dd80 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61  ng values. Compa
1dd90 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
1dda0 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63  s.** using the c
1ddb0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1ddc0 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61  e pColl. As usua
1ddd0 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61  l, return a nega
1dde0 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  tive , zero.** o
1ddf0 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  r positive value
1de00 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65   if *pMem1 is le
1de10 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1de20 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  o or greater tha
1de30 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65  n .** *pMem2, re
1de40 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69  spectively. Simi
1de50 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f  lar in spirit to
1de60 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20   "rc = (*pMem1) 
1de70 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f  - (*pMem2);"..*/
1de80 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1de90 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1dea0 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  (.  const Mem *p
1deb0 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65  Mem1,.  const Me
1dec0 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73  m *pMem2,.  cons
1ded0 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1dee0 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20  ,.  u8 *prcErr  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d      /* If an OOM
1df10 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20   occurs, set to 
1df20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a  SQLITE_NOMEM */.
1df30 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
1df40 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
1df50 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
1df60 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
1df70 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
1df80 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
1df90 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
1dfa0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1dfb0 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
1dfc0 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
1dfd0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1dfe0 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
1dff0 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
1e000 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
1e010 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1e020 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
1e030 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b  *v2;.    Mem c1;
1e040 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
1e050 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1e060 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e  nit(&c1, pMem1->
1e070 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1e080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e090 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31  mInit(&c2, pMem1
1e0a0 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1e0b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e0c0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1e0d0 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45  c1, pMem1, MEM_E
1e0e0 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  phem);.    sqlit
1e0f0 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1e100 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c  Copy(&c2, pMem2,
1e110 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1e120 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v1 = sqlite3Val
1e130 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1e140 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c  value*)&c1, pCol
1e150 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20  l->enc);.    v2 
1e160 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1e170 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1e180 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
1e190 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  nc);.    if( (v1
1e1a0 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b  ==0 || v2==0) ){
1e1b0 0a 20 20 20 20 20 20 69 66 28 20 70 72 63 45 72  .      if( prcEr
1e1c0 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51  r ) *prcErr = SQ
1e1d0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1e1e0 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
1e1f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e200 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1e210 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63  (pColl->pUser, c
1e220 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76  1.n, v1, c2.n, v
1e230 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
1e240 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e250 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1e260 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e270 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
1e280 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1e290 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
1e2a0 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74  pBlob is guarant
1e2b0 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62  eed to be a Blob
1e2c0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72   that is not mar
1e2d0 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f  ked.** with MEM_
1e2e0 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72  Zero.  Return tr
1e2f0 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62  ue if it could b
1e300 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a  e a zero-blob..*
1e310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
1e320 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61  llZero(const cha
1e330 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
1e340 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1e350 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1e360 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75   if( z[i] ) retu
1e370 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1e380 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1e390 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1e3a0 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1e3b0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1e3c0 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1e3d0 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1e3e0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1e3f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1e400 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1e410 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1e420 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1e430 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1e440 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1e450 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1e460 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  .*/.SQLITE_NOINL
1e470 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42  INE int sqlite3B
1e480 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
1e490 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74   Mem *pB1, const
1e4a0 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e   Mem *pB2){.  in
1e4b0 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20  t c;.  int n1 = 
1e4c0 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32  pB1->n;.  int n2
1e4d0 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a   = pB2->n;..  /*
1e4e0 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
1e4f0 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76  to have a Blob v
1e500 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73 6f  alue that has so
1e510 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74  me non-zero cont
1e520 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65  ent.  ** followe
1e530 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e  d by zero conten
1e540 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c  t.  But that onl
1e550 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42  y comes up for B
1e560 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a  lobs formed.  **
1e570 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1e580 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e  ecord opcode, an
1e590 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76  d such Blobs nev
1e5a0 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69 6e  er get passed in
1e5b0 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d  to.  ** sqlite3M
1e5c0 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a  emCompare(). */.
1e5d0 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e    assert( (pB1->
1e5e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1e5f0 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b  )==0 || n1==0 );
1e600 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32 2d  .  assert( (pB2-
1e610 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1e620 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29  o)==0 || n2==0 )
1e630 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66  ;..  if( (pB1->f
1e640 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29  lags|pB2->flags)
1e650 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1e660 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67     if( pB1->flag
1e670 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26  s & pB2->flags &
1e680 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1e690 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75     return pB1->u
1e6a0 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e  .nZero - pB2->u.
1e6b0 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  nZero;.    }else
1e6c0 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20   if( pB1->flags 
1e6d0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1e6e0 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1e6f0 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e  ro(pB2->z, pB2->
1e700 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  n) ) return -1;.
1e710 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31        return pB1
1e720 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a  ->u.nZero - n2;.
1e730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e740 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
1e750 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20  pB1->z, pB1->n) 
1e760 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1e770 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70     return n1 - p
1e780 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1e790 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d   }.  }.  c = mem
1e7a0 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d  cmp(pB1->z, pB2-
1e7b0 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a  >z, n1>n2 ? n2 :
1e7c0 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20   n1);.  if( c ) 
1e7d0 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75  return c;.  retu
1e7e0 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f  rn n1 - n2;.}../
1e7f0 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72  *.** Do a compar
1e800 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36  ison between a 6
1e810 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
1e820 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69  eger and a 64-bi
1e830 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  t floating-point
1e840 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  .** number.  Ret
1e850 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1e860 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1e870 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36  if the first (i6
1e880 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  4) is less than,
1e890 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  .** equal to, or
1e8a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1e8b0 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65  e second (double
1e8c0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1e8d0 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1e8e0 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64  Compare(i64 i, d
1e8f0 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20  ouble r){.  if( 
1e900 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c  sizeof(LONGDOUBL
1e910 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20  E_TYPE)>8 ){.   
1e920 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
1e930 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45   x = (LONGDOUBLE
1e940 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28  _TYPE)i;.    if(
1e950 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   x<r ) return -1
1e960 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20  ;.    if( x>r ) 
1e970 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1e980 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1e990 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20  {.    i64 y;.   
1e9a0 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69   double s;.    i
1e9b0 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36  f( r<-9223372036
1e9c0 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65  854775808.0 ) re
1e9d0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28  turn +1;.    if(
1e9e0 20 72 3e 3d 39 32 32 33 33 37 32 30 33 36 38 35   r>=922337203685
1e9f0 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1ea00 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1ea10 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1ea20 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1ea30 20 20 20 20 69 66 28 20 69 3e 79 20 29 20 72 65      if( i>y ) re
1ea40 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20 3d  turn +1;.    s =
1ea50 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20   (double)i;.    
1ea60 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e  if( s<r ) return
1ea70 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72   -1;.    if( s>r
1ea80 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ea90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1eaa0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1eab0 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1eac0 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1ead0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1eae0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1eaf0 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1eb00 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1eb10 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1eb20 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1eb30 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1eb40 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1eb50 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1eb60 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1eb70 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1eb80 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1eb90 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1eba0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1ebb0 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1ebc0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1ebd0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1ebe0 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1ebf0 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1ec00 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1ec10 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1ec20 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1ec30 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1ec40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ec50 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1ec60 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1ec70 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1ec80 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1ec90 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1eca0 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1ecb0 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1ecc0 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1ecd0 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1ece0 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1ecf0 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1ed00 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
1ed10 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
1ed20 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
1ed30 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1ed40 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1ed50 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1ed60 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1ed70 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1ed80 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1ed90 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1eda0 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1edb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1edc0 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1edd0 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1ede0 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  ..  /* At least 
1edf0 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76  one of the two v
1ee00 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65  alues is a numbe
1ee10 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  r.  */.  if( com
1ee20 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1ee30 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1ee40 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1ee50 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1ee60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1ee70 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1ee80 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1ee90 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1eea0 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1eeb0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
1eec0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1eed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1eee0 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52  (f1 & f2 & MEM_R
1eef0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1ef00 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1ef10 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  < pMem2->u.r ) r
1ef20 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1ef30 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e  if( pMem1->u.r >
1ef40 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1ef50 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1ef60 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1ef70 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49     if( (f1&MEM_I
1ef80 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1ef90 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
1efa0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1efb0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
1efc0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1efd0 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d  em1->u.i, pMem2-
1efe0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1eff0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1f000 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1f010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1f020 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1f030 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1f040 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1f050 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71        return -sq
1f060 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1f070 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c  pare(pMem2->u.i,
1f080 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20   pMem1->u.r);.  
1f090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f0a0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1f0b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f0c0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a  return +1;.  }..
1f0d0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1f0e0 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1f0f0 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1f100 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1f110 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1f120 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1f130 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1f140 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1f150 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1f160 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1f170 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1f180 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1f190 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1f1a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1f1b0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1f1c0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1f1d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1f1e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1f1f0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1f200 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70  =pMem2->enc || p
1f210 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Mem1->db->malloc
1f220 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
1f230 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1f240 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1f250 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1f260 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1f270 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1f280 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1f290 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1f2a0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1f2b0 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1f2c0 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1f2d0 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1f2e0 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1f2f0 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1f300 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1f310 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1f320 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1f330 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1f340 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1f350 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1f360 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1f370 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1f380 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1f390 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1f3a0 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1f3b0 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1f3c0 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1f3d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1f3e0 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1f3f0 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1f400 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1f410 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1f420 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1f430 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1f440 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1f450 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1f460 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1f470 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1f480 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1f490 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1f4a0 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1f4b0 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1f4c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1f4d0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1f4e0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1f4f0 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1f500 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1f510 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1f520 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1f530 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1f540 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1f550 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1f560 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1f570 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1f580 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1f590 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1f5a0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1f5b0 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1f5c0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1f5d0 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1f5e0 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1f5f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1f600 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1f610 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1f620 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1f630 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1f640 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1f650 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1f660 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1f670 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1f680 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1f690 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1f6a0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1f6b0 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1f6c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f6d0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1f6e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1f6f0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1f700 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1f710 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1f720 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1f730 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1f740 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1f750 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1f760 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1f770 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1f780 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1f790 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1f7a0 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1f7b0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1f7c0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1f7d0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1f7e0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1f7f0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1f800 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1f810 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1f820 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1f830 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1f840 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1f850 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1f860 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1f870 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1f880 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1f890 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1f8a0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1f8b0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1f8c0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1f8d0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1f8e0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1f8f0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1f900 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1f910 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1f920 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1f930 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1f940 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1f950 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f960 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1f970 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1f980 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1f990 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1f9a0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1f9b0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1f9c0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1f9d0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1f9e0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1f9f0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1fa00 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1fa10 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1fa20 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1fa30 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1fa40 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1fa50 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1fa60 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1fa70 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1fa80 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1fa90 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1faa0 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1fab0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1fac0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1fad0 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1fae0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1faf0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1fb00 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1fb10 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1fb20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1fb30 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1fb40 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1fb50 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1fb60 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1fb70 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1fb80 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1fb90 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1fba0 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1fbb0 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1fbc0 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1fbd0 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1fbe0 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1fbf0 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1fc00 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1fc10 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1fc20 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1fc30 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1fc40 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1fc50 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1fc60 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1fc70 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1fc80 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1fc90 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1fca0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1fcb0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1fcc0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1fcd0 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1fce0 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1fcf0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1fd00 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1fd10 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1fd20 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1fd30 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1fd40 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1fd50 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1fd60 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1fd70 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1fd80 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1fd90 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1fda0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1fdb0 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1fdc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1fdd0 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1fde0 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1fdf0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1fe20 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1fe30 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1fe40 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1fe70 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1fe80 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1fe90 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1fea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1feb0 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1fec0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1fed0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1ff00 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1ff10 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1ff20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ff30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1ff40 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1ff50 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1ff60 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1ff70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1ff80 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1ff90 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1ffa0 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
1ffb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1ffc0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1ffd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1ffe0 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
1fff0 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
20000 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
20010 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
20020 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
20030 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
20040 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
20050 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
20060 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
20070 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
20080 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
20090 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
200a0 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
200b0 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
200c0 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
200d0 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
200e0 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
200f0 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
20100 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
20110 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
20120 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
20130 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
20140 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
20150 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
20160 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
20170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
20180 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
20190 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
201a0 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
201b0 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69      if( d1>(unsi
201c0 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
201d0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
201e0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
201f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20200 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
20210 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
20220 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  /.    }.    i = 
20230 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e  0;.  }..  VVA_ON
20240 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
20250 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
20260 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
20270 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
20280 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  /.  assert( pPKe
20290 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  y2->pKeyInfo->nA
202a0 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  llField>=pPKey2-
202b0 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
202c0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
202d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
202e0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
202f0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
20300 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
20310 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
20320 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
20330 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
20340 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
20350 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
20360 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
20370 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e   /* RHS is an in
20380 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  teger */.    if(
20390 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
203a0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
203b0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
203c0 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
203d0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
203e0 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
203f0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
20400 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
20410 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
20420 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
20430 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
20440 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
20450 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
20460 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
20470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20480 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
20490 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
204a0 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
204b0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c         rc = -sql
204c0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
204d0 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d  are(pRhs->u.i, m
204e0 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em1.u.r);.      
204f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
20500 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63  64 lhs = vdbeRec
20510 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72  ordDecodeInt(ser
20520 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31  ial_type, &aKey1
20530 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [d1]);.        i
20540 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  64 rhs = pRhs->u
20550 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  .i;.        if( 
20560 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
20570 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
20580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20590 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
205a0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
205b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
205c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
205d0 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20  S is real */.   
205e0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
205f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
20600 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
20610 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
20620 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  x1];.      if( s
20630 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
20640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72  {.        /* Ser
20650 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20  ial types 12 or 
20660 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69  greater are stri
20670 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67  ngs and blobs (g
20680 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20  reater than.    
20690 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e      ** numbers).
206a0 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31   Types 10 and 11
206b0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22   are currently "
206c0 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  reserved for fut
206d0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
206e0 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73  use", so it does
206f0 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65  n't really matte
20700 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c  r what the resul
20710 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a  ts of comparing.
20720 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20          ** them 
20730 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75  to numberic valu
20740 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20  es are.  */.    
20750 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
20760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
20770 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
20780 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
20790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
207a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
207b0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
207c0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
207d0 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
207e0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
207f0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
20800 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c     if( mem1.u.r<
20810 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
20820 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
20830 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
20840 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70  e if( mem1.u.r>p
20850 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
20860 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
20870 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20890 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
208a0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
208b0 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73  e(mem1.u.i, pRhs
208c0 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20  ->u.r);.        
208d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
208e0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
208f0 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65   string */.    e
20900 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
20910 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
20920 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
20930 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
20940 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
20950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
20960 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
20970 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
20980 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
20990 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
209a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
209b0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
209c0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
209d0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
209e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
209f0 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m1.n = (serial_t
20a00 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
20a10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20a20 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75   (d1+mem1.n)==(u
20a30 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
20a40 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20a50 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29  e( (d1+mem1.n+1)
20a60 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
20a70 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
20a80 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28   (d1+mem1.n) > (
20a90 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
20aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
20ab0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
20ac0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
20ad0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
20ae0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
20af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
20b00 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
20b10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4b     }else if( (pK
20b20 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
20b30 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e 61 43 6f 6c  >pKeyInfo)->aCol
20b40 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
20b50 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
20b60 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
20b70 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
20b80 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
20b90 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
20ba0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
20bb0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
20bc0 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
20bd0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
20be0 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
20bf0 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
20c00 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
20c10 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
20c20 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
20c30 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
20c40 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
20c50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
20c60 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
20c70 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
20c80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
20c90 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
20ca0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
20cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20cc0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
20cd0 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
20ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20cf0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20d00 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
20d10 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
20d20 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
20d30 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73  Blob ){.      as
20d40 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61  sert( (pRhs->fla
20d50 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
20d60 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20  0 || pRhs->n==0 
20d70 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  );.      getVari
20d80 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
20d90 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
20da0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20db0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
20dc0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
20dd0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
20de0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
20df0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
20e00 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
20e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
20e20 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
20e30 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
20e40 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20e50 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
20e60 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
20e70 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20e80 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
20e90 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20ea0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
20eb0 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
20ec0 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
20ed0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
20ee0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
20ef0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20f00 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
20f10 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
20f20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
20f30 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
20f40 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
20f50 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
20f60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
20f70 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e   !isAllZero((con
20f80 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  st char*)&aKey1[
20f90 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20  d1],nStr) ){.   
20fa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
20fb0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
20fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20fd0 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
20fe0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20  u.nZero;.       
20ff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
21000 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
21010 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
21020 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
21030 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
21040 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
21050 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
21060 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
21070 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
21080 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
21090 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
210a0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
210b0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
210c0 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
210d0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
210e0 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
210f0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
21100 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
21110 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
21120 66 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  f( pPKey2->pKeyI
21130 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
21140 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
21150 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
21160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64        assert( vd
21170 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
21180 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
21190 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29  1, pPKey2, rc) )
211a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
211b0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
211c0 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
211d0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
211e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
211f0 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20    }..    i++;.  
21200 20 20 69 66 28 20 69 3d 3d 70 50 4b 65 79 32 2d    if( i==pPKey2-
21210 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b  >nField ) break;
21220 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
21230 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
21240 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
21250 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
21260 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
21270 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
21280 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
21290 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
212a0 64 29 73 7a 48 64 72 31 20 26 26 20 64 31 3c 3d  d)szHdr1 && d1<=
212b0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
212c0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
212d0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
212e0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
212f0 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
21300 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
21310 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
21320 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
21330 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
21340 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
21350 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
21360 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
21370 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
21380 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
21390 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
213a0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
213b0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
213c0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72  eans that one or
213d0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79   both of the key
213e0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
213f0 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
21400 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
21410 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
21420 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
21430 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
21440 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
21450 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
21460 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76  _DB .       || v
21470 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21480 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
21490 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65  y1, pPKey2, pPKe
214a0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20  y2->default_rc) 
214b0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
214c0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
214d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
214e0 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  );.  pPKey2->eqS
214f0 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  een = 1;.  retur
21500 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
21510 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
21520 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21530 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
21540 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
21550 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
21560 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
21570 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
21580 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
21590 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
215a0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
215b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
215c0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
215d0 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
215e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
215f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
21600 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
21610 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
21620 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
21630 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
21640 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
21650 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
21660 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
21670 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
21680 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
21690 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
216a0 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
216b0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
216c0 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
216d0 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
216e0 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
216f0 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
21700 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
21710 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
21720 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
21730 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
21740 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
21750 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
21760 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
21770 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
21780 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
21790 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
217a0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
217b0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
217c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
217d0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
217e0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
217f0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
21800 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
21810 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
21820 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
21830 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
21840 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
21850 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
21860 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
21870 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
21880 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a   v;.  i64 lhs;..
21890 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
218a0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
218b0 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
218c0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
218d0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
218e0 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
218f0 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
21900 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
21910 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
21920 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
21930 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
21940 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
21950 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
21960 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
21970 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
21980 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21990 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
219a0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
219b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
219c0 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
219d0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
219e0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
219f0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
21a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21a10 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
21a20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
21a30 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
21a40 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
21a50 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
21a60 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
21a70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21a80 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
21a90 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
21aa0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
21ab0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
21ac0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
21ad0 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
21ae0 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
21af0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
21b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21b10 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
21b20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
21b30 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
21b40 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
21b50 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
21b60 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
21b70 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
21b80 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
21b90 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
21ba0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21bb0 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
21bc0 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
21bd0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
21be0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
21bf0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
21c00 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
21c10 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
21c20 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
21c30 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
21c40 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
21c50 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
21c60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21c70 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
21c80 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
21c90 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
21ca0 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
21cb0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
21cc0 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
21cd0 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
21ce0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
21cf0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
21d00 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
21d10 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
21d20 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
21d30 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
21d40 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
21d50 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
21d60 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
21d70 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
21d80 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
21d90 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
21da0 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
21db0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
21dc0 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
21dd0 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
21de0 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
21df0 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
21e00 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
21e10 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
21e20 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
21e30 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
21e40 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
21e50 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
21e60 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
21e70 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
21e80 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
21e90 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21ea0 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
21eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
21ec0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21ed0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
21ee0 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
21ef0 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d  }..  v = pPKey2-
21f00 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
21f10 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
21f20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21f30 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
21f40 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
21f50 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
21f60 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
21f70 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
21f80 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
21f90 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
21fa0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
21fb0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
21fc0 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
21fd0 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
21fe0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
21ff0 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
22000 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
22010 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
22020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
22030 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
22040 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
22050 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68  are equal and th
22060 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c  ere are no trail
22070 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ing.    ** field
22080 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32  s. Return pPKey2
22090 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20  ->default_rc in 
220a0 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
220b0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
220c0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
220d0 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
220e0 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   1;.  }..  asser
220f0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
22100 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
22110 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22120 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
22130 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
22140 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22150 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
22160 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
22170 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22180 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
22190 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
221a0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
221b0 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
221c0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
221d0 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
221e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
221f0 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
22200 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
22210 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
22220 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
22230 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
22240 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
22250 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
22260 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
22270 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
22280 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
22290 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
222a0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
222b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
222c0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
222d0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
222e0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
222f0 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
22300 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
22310 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
22320 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  s;..  assert( pP
22330 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c  Key2->aMem[0].fl
22340 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
22350 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
22360 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
22370 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
22380 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
22390 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  fo);.  getVarint
223a0 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
223b0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
223c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
223d0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
223e0 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
223f0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
22400 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
22410 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
22420 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
22430 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
22440 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
22450 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
22460 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
22470 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
22480 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
22490 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
224a0 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
224b0 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
224c0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
224d0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
224e0 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
224f0 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
22500 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
22510 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
22520 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22530 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
22540 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
22550 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
22560 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
22570 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
22580 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
22590 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
225a0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
225b0 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
225c0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
225d0 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
225e0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
225f0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
22600 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
22610 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
22620 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
22630 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
22640 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22650 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
22660 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
22670 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
22680 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
22690 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
226a0 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t_rc;.          
226b0 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
226c0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
226d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
226e0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
226f0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
22700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22710 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
22720 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
22730 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
22740 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
22750 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
22760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22770 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
22780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
22790 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
227a0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
227b0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
227c0 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
227d0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
227e0 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
227f0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
22800 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
22810 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
22820 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22830 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
22840 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22850 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
22860 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
22870 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
22880 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
22890 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
228a0 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
228b0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
228c0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
228d0 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
228e0 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
228f0 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
22900 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
22910 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
22920 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
22930 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
22940 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
22950 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
22960 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
22970 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
22980 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
22990 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
229a0 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
229b0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
229c0 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
229d0 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
229e0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
229f0 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
22a00 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
22a10 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
22a20 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
22a30 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
22a40 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
22a50 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
22a60 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
22a70 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
22a80 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
22a90 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
22aa0 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
22ab0 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
22ac0 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
22ad0 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
22ae0 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
22af0 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
22b00 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
22b10 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
22b20 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
22b30 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
22b40 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
22b50 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
22b60 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
22b70 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
22b80 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
22b90 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
22ba0 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
22bb0 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
22bc0 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
22bd0 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
22be0 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
22bf0 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
22c00 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
22c10 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
22c20 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
22c30 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
22c40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b 65   */.  if( p->pKe
22c50 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
22c60 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20  <=13 ){.    int 
22c70 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b  flags = p->aMem[
22c80 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66  0].flags;.    if
22c90 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ( p->pKeyInfo->a
22ca0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a  SortOrder[0] ){.
22cb0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b        p->r1 = 1;
22cc0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d  .      p->r2 = -
22cd0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22ce0 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a      p->r1 = -1;.
22cf0 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b        p->r2 = 1;
22d00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
22d10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
22d20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22d30 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
22d40 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  reInt;.    }.   
22d50 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
22d60 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
22d70 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
22d80 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  gs & MEM_Null );
22d90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
22da0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
22db0 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  );.    if( (flag
22dc0 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  s & (MEM_Real|ME
22dd0 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29  M_Null|MEM_Blob)
22de0 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49  )==0 && p->pKeyI
22df0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30  nfo->aColl[0]==0
22e00 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22e10 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
22e20 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r );.      retur
22e30 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
22e40 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d  areString;.    }
22e50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
22e60 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22e70 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  Compare;.}../*.*
22e80 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
22e90 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
22ea0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
22eb0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
22ec0 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
22ed0 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
22ee0 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
22ef0 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
22f00 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
22f10 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
22f20 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
22f30 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
22f40 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
22f50 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
22f60 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
22f70 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
22f80 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
22f90 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
22fa0 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
22fb0 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
22fc0 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
22fd0 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
22fe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
22ff0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
23000 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
23010 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
23020 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
23030 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
23040 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
23050 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
23060 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
23070 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
23080 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
23090 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
230a0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
230b0 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
230c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
230d0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
230e0 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47  em m, v;..  /* G
230f0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
23100 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
23110 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
23120 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
23130 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
23140 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
23150 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
23160 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
23170 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
23180 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
23190 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
231a0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
231b0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
231c0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
231d0 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
231e0 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
231f0 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
23200 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
23210 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
23220 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
23230 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   nCellKey = sqli
23240 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
23250 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73  ize(pCur);.  ass
23260 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26  ert( (nCellKey &
23270 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
23280 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20  ==(u64)nCellKey 
23290 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  );..  /* Read in
232a0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
232b0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64  ntent of the ind
232c0 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71  ex entry */.  sq
232d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
232e0 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72  (&m, db, 0);.  r
232f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
23300 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
23310 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
23320 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72  ey, &m);.  if( r
23330 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
23340 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
23350 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
23360 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
23370 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
23380 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
23390 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
233a0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
233b0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
233c0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
233d0 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
233e0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
233f0 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
23400 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
23410 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
23420 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
23430 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
23440 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
23450 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
23460 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
23470 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
23480 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
23490 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
234a0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
234b0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
234c0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
234d0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
234e0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
234f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23500 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
23510 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
23520 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
23530 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
23540 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
23550 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
23560 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23570 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
23580 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
23590 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
235a0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
235b0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
235c0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
235d0 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
235e0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
235f0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
23600 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
23610 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
23620 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
23630 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
23640 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
23650 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
23660 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
23670 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
23680 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
23690 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
236a0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
236b0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
236c0 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
236d0 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
236e0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
236f0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
23700 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
23710 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
23720 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
23730 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
23740 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
23750 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
23760 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
23770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
23780 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
23790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
237a0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
237b0 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
237c0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
237d0 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
237e0 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
237f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
23800 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
23810 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
23820 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
23830 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
23840 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
23850 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23860 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
23870 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
23880 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
23890 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
238a0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
238b0 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
238c0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
238d0 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
238e0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
238f0 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
23900 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
23910 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
23920 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
23930 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
23940 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
23950 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
23960 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23970 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
23980 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
23990 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
239a0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
239b0 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
239c0 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
239d0 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
239e0 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
239f0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
23a00 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
23a10 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
23a20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
23a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
23a40 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
23a50 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
23a60 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
23a70 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
23a80 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
23a90 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
23aa0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
23ab0 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
23ac0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
23ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
23ae0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23af0 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
23b00 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
23b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
23b20 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
23b30 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
23b40 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
23b50 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
23b60 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
23b70 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
23b80 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
23bb0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
23bc0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
23bd0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
23be0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
23bf0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20  or *pCur;.  Mem 
23c00 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  m;..  assert( pC
23c10 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
23c20 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
23c30 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  Cur = pC->uc.pCu
23c40 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
23c50 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23c60 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
23c70 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20  );.  nCellKey = 
23c80 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
23c90 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20  oadSize(pCur);. 
23ca0 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
23cb0 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
23cc0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
23cd0 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
23ce0 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61  the way.  ** tha
23cf0 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
23d00 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
23d10 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
23d20 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
23d30 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
23d40 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
23d50 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
23d60 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
23d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23d80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
23d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
23da0 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
23db0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
23dc0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
23dd0 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
23de0 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69  ellKey, &m);.  i
23df0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
23e00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
23e10 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
23e20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
23e30 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  hSkip(m.n, m.z, 
23e40 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
23e50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
23e60 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
23e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23e80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
23e90 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
23ea0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
23eb0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
23ec0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
23ed0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
23ee0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23ef0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
23f00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
23f10 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
23f20 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
23f30 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
23f40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23f50 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
23f60 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
23f70 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
23f80 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
23f90 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
23fa0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
23fb0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
23fc0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
23fd0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
23fe0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
23ff0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
24000 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
24010 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
24020 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
24030 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
24040 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
24050 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
24060 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24070 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
24080 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
24090 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
240a0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
240b0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
240c0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
240d0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
240e0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
240f0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
24100 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
24110 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
24120 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
24130 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
24140 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
24150 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
24160 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
24170 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
24180 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
24190 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
241a0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
241b0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
241c0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
241d0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a  s obsolete..**.*
241e0 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c  * If iCode is 1,
241f0 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e   then expiration
24200 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
24210 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f  he statement sho
24220 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70  uld.** be reprep
24230 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
24240 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75 74  g restarted, but
24250 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
24260 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20  y running.** it 
24270 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75  is allowed to ru
24280 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  n to completion.
24290 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c  .**.** Internall
242a0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
242b0 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 56   just sets the V
242c0 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67  dbe.expired flag
242d0 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61   on all.** prepa
242e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  red statements. 
242f0 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74   The flag is set
24300 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d   to 1 for an imm
24310 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69 6f  ediate expiratio
24320 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20  n.** and set to 
24330 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72  2 for an advisor
24340 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f  y expiration..*/
24350 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24360 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
24370 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
24380 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20  b, int iCode){. 
24390 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
243a0 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
243b0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
243c0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
243d0 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a  iCode+1;.  }.}..
243e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
243f0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
24400 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
24410 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
24420 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
24430 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
24440 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
24450 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49   Return the SQLI
24460 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73  TE_PREPARE flags
24470 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a   for a Vdbe..*/.
24480 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  u8 sqlite3VdbePr
24490 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20  epareFlags(Vdbe 
244a0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
244b0 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  >prepFlags;.}../
244c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
244d0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
244e0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
244f0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
24500 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
24510 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
24520 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
24530 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
24540 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
24550 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
24560 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
24570 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
24580 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
24590 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
245a0 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
245b0 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
245c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
245d0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
245e0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
245f0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
24600 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
24610 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
24620 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
24630 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
24640 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
24650 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
24660 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
24670 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
24680 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
24690 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
246a0 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61  r[iVar-1];.    a
246b0 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
246c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
246d0 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
246e0 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
246f0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
24700 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
24710 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
24720 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
24730 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
24740 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
24750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24760 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
24770 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
24780 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
24790 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
247a0 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
247b0 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
247c0 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
247d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
247e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
247f0 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
24800 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
24810 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
24820 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
24830 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
24840 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
24850 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
24860 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
24870 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
24880 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
24890 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
248a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
248b0 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
248c0 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
248d0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
248e0 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
248f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
24900 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
24910 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20  .  if( iVar>=32 
24920 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
24930 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b  k |= 0x80000000;
24940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
24950 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
24960 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
24970 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
24980 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  ause a function 
24990 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  to throw an erro
249a0 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c  r if it was call
249b0 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e   from OP_PureFun
249c0 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  c.** rather than
249d0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OP_Function..**
249e0 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20  .** OP_PureFunc 
249f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
24a00 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
24a10 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61  deterministic, a
24a20 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72  nd should.** thr
24a30 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
24a40 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74  t is given input
24a50 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  s that would mak
24a60 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  e it non-determi
24a70 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20  nistic..** This 
24a80 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
24a90 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20  ed by date/time 
24aa0 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
24ab0 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  se non-determini
24ac0 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73  stic.** features
24ad0 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a   such as 'now'..
24ae0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  */.int sqlite3No
24af0 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65  tPureFunc(sqlite
24b00 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
24b10 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
24b20 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
24b30 53 54 41 54 34 0a 20 20 69 66 28 20 70 43 74 78  STAT4.  if( pCtx
24b40 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74  ->pVdbe==0 ) ret
24b50 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 1;.#endif.  
24b60 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d  if( pCtx->pVdbe-
24b70 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e  >aOp[pCtx->iOp].
24b80 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46  opcode==OP_PureF
24b90 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
24ba0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
24bb0 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e  pCtx, .       "n
24bc0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
24bd0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64   function in ind
24be0 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  ex expression or
24bf0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
24c00 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a  t",.       -1);.
24c10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
24c20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
24c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24c40 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
24c50 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
24c60 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
24c70 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
24c80 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
24c90 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
24ca0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
24cb0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
24cc0 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
24cd0 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
24ce0 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
24cf0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
24d00 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
24d10 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
24d20 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
24d30 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
24d40 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
24d50 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
24d60 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
24d70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24d80 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
24d90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
24da0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
24db0 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
24dc0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
24dd0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
24de0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24df0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
24e00 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
24e10 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
24e20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
24e30 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
24e40 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
24e50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
24e60 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
24e70 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
24e80 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
24e90 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
24ea0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
24eb0 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
24ec0 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
24ed0 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
24ee0 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
24ef0 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
24f00 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
24f10 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
24f20 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
24f30 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
24f40 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
24f50 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
24f60 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
24f70 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
24f80 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
24f90 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
24fa0 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
24fb0 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
24fc0 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
24fd0 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
24fe0 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55  b, int nField, U
24ff0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
25000 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
25010 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
25020 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
25030 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20  i++){.      Mem 
25040 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
25050 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
25060 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73  Mem->zMalloc ) s
25070 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
25080 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
25090 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
250a0 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
250b0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
250c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
250d0 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
250e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
250f0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
25100 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
25110 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
25120 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
25130 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
25140 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
25150 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
25160 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
25170 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25180 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
25190 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
251a0 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
251b0 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
251c0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
251d0 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
251e0 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
251f0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
25200 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
25210 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
25220 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
25230 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
25240 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
25250 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
25280 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
25290 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
252a0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
252b0 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
252c0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
252d0 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
252e0 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
252f0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
25300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25310 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
25320 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
25330 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25340 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
25350 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
25360 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
25370 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
25380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
25390 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
253a0 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
253d0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
253e0 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
253f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25400 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
25410 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
25420 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
25430 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
25440 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
25450 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
25460 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
25470 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
25480 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
25490 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
254a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
254b0 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
254c0 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
254d0 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
254e0 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
254f0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
25500 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
25510 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
25520 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
25530 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
25540 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
25550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
25560 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
25570 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
25580 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
25590 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
255a0 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
255b0 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
255c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
255d0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
255e0 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
255f0 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
25600 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
25610 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
25620 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
25630 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
25640 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
25650 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
25660 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
25670 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
25680 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
25690 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
256a0 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
256b0 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
256c0 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
256d0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
256e0 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d  info.nKeyField =
256f0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70   pTab->nCol;.  p
25700 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25710 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  .aSortOrder = (u
25720 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65  8*)&fakeSortOrde
25730 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  r;.  preupdate.i
25740 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key1 = iKey1;.  
25750 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20  preupdate.iKey2 
25760 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70  = iKey2;.  preup
25770 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62  date.pTab = pTab
25780 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  ;..  db->pPreUpd
25790 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65  ate = &preupdate
257a0 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
257b0 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
257c0 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62  PreUpdateArg, db
257d0 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
257e0 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a   iKey1, iKey2);.
257f0 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
25800 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
25810 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
25820 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20  ate.aRecord);.  
25830 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
25840 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b  (db, preupdate.k
25850 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64  eyinfo.nKeyField
25860 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  +1, preupdate.pU
25870 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
25880 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
25890 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
258a0 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20  fo.nKeyField+1, 
258b0 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e  preupdate.pNewUn
258c0 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70  packed);.  if( p
258d0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b  reupdate.aNew ){
258e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
258f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
25900 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
25910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25920 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75  MemRelease(&preu
25930 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a  pdate.aNew[i]);.
25940 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25950 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72  3DbFreeNN(db, pr
25960 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20  eupdate.aNew);. 
25970 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
25980 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
25990 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.